No se puede cargar una imagen codificada en base64 utilizando Codeigniter

Tengo que subir una imagen codificada en base64 que estoy recibiendo de la aplicación de Android. Estoy usando el framework php codeigniter. Mientras busca en el foro, la pregunta en este enlace Cómo cargar una imagen codificada en base64 en codeigniter es la misma que la mía, pero la solución no funciona para mí.

Aquí está el código que he escrito:

private function _save_image() { $image = base64_decode($_POST['imageString']); #setting the configuration values for saving the image $config['upload_path'] = FCPATH . 'path_to_image_folder'; $config['file_name'] = 'my_image'.$_POST['imageType']; $config['allowed_types'] = 'gif|jpg|jpeg|png'; $config['max_size'] = '2048'; $config['remove_spaces'] = TRUE; $config['encrypt_name'] = TRUE; $this->load->library('upload', $config); if($this->upload->do_upload($image)) { $arr_image_info = $this->upload->data(); return ($arr_image_info['full_path']); } else { echo $this->upload->display_errors(); die(); } } 

Estoy obteniendo “no seleccionó un archivo para subir”

Gracias por tu tiempo.

El error se está produciendo porque la biblioteca de carga de codeigniter buscará en $_FILES superglobal y buscará un índice que le des en la llamada do_upload() .

Además (al menos en la versión 2.1.2), incluso si configurara $ _FILES superglobal para imitar el comportamiento de una carga de archivos, no pasaría porque la biblioteca de carga usa is_uploaded_file para detectar exactamente ese tipo de manipulación de superglobales. Puede rastrear el código en sistema / bibliotecas / Upload.php: 134

Me temo que tendrá que volver a implementar la comprobación de tamaño y el cambio de nombre y cambio de archivos (haría esto) o puede modificar el codificador para omitir esa comprobación, pero podría dificultar la actualización del marco más adelante.

  1. Guarde el contenido de la variable $ image en un archivo temporal y configure los $_FILES para que se vean así:

      $temp_file_path = tempnam(sys_get_temp_dir(), 'androidtempimage'); // might not work on some systems, specify your temp path if system temp dir is not writeable file_put_contents($temp_file_path, base64_decode($_POST['imageString'])); $image_info = getimagesize($temp_file_path); $_FILES['userfile'] = array( 'name' => uniqid().'.'.preg_replace('!\w+/!', '', $image_info['mime']), 'tmp_name' => $temp_file_path, 'size' => filesize($temp_file_path), 'error' => UPLOAD_ERR_OK, 'type' => $image_info['mime'], ); 
  2. Modificar la biblioteca de carga. Puede usar la forma incorporada de Codeigniter de Extender bibliotecas nativas y definir una clase My_Upload (o su prefijo), copiar y pegar la función do_upload y cambiar las siguientes líneas:

     public function do_upload($field = 'userfile') 

    a:

     public function do_upload($field = 'userfile', $fake_upload = false) 

    y el:

     if ( ! is_uploaded_file($_FILES[$field]['tmp_name']) ) 

    a:

     if ( ! is_uploaded_file($_FILES[$field]['tmp_name']) && !$fake_upload ) 

    y en su controlador, llame a do_upload () con los parámetros de flujo:

     $this->upload->do_upload('userfile', true); 

Es consciente de que si recibe una imagen codificada en Base64, como una cadena, no necesita utilizar la clase Upload.

En su lugar, solo necesitas decodificarlo usando base64_decode y luego usar fwrite / file_put_contents para guardar los datos decodificados …

 $img = imagecreatefromstring(base64_decode($string)); if($img != false) { imagejpeg($img, '/path/to/new/image.jpg'); } 

Crédito: http://board.phpbuilder.com/showthread.php?10359450-RESOLVED-Saving-Base64-image .