【问题标题】:Unable to upload a base64 encoded image using Codeigniter无法使用 Codeigniter 上传 base64 编码图像
【发布时间】:2012-07-20 11:27:44
【问题描述】:

我必须上传从 android 应用程序接收的 base64 编码图像。我正在使用 php codeigniter 框架。 在论坛中搜索时,此链接How to upload base64encoded image in codeigniter 的问题与我的相同,但那里的解决方案对我不起作用。

这是我写的代码:

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();
    }
}

我收到“您没有选择要上传的文件”

感谢您的宝贵时间。

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    发生错误是因为 codeigniter 的上传库将查看 $_FILES 超全局并搜索您在 do_upload() 调用时为其提供的索引。

    此外(至少在版本 2.1.2 中)即使您设置 $_FILES 超全局来模仿文件上传的行为,它也不会通过,因为上传库使用 is_uploaded_file 来准确检测那种篡改超全局变量。您可以在 system/libraries/Upload.php:134 中跟踪代码

    恐怕您将不得不重新实现大小检查以及文件重命名和移动(我会这样做),或者您可以修改 codeigniter 以省略该检查,但这可能会使以后升级框架变得困难。

    1. 将 $image 变量的内容保存到一个临时文件中,并将$_FILES 设置为如下所示:

       $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. 修改上传库。您可以使用 codeigniter 内置的 way of Extending Native Libraries,并定义一个 My_Upload(或您的前缀)类,复制粘贴 do_upload 函数并更改以下行:

      public function do_upload($field = 'userfile')
      

      到:

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

      还有:

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

      到:

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

      在您的控制器中,使用流动参数调用 do_upload():

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

    【讨论】:

    • 您好,感谢您的回复。我根据您的指南进行了更改,但出现以下错误: 1. 第 86 行的未定义索引是 ` $this->file_name = $this->_prep_filename($_FILES[$field]['name'] ); ` 在我在 MY_Upload 类中复制的 do_upload 函数中。 2. 您尝试上传的文件类型不被允许。这是 print_r ` Array ( [userfile] => Array ( [tmp_name] => C:\Windows\Temp\and15BC.tmp [size] => 354129 [error] => 0 [type] => image/ png ) )`
    • 我忘记了 $_FILES 中的 'name' 键,将示例更新为,应该可以解决这两个错误。
    • 嗨 complex857,图片上传功能在我的系统上运行良好,我的系统是 windows 7,wamp。但是今天我将它上传到服务器,并且代码在那里不起作用。我收到“您没有选择要上传的文件”这条消息。我回应了 file_put_contents() 函数的输出,根据文档,我得到了字节数。请帮我。如果它有任何用处,我必须运行它的服务器是亚马逊 ec2 linux 服务器。
    • 听起来 CI 没有找到你的 MY_Upload 类。检查文件名中的大写/小写字符,windows 不区分大小写,而 unix 系统是。您可以通过在控制器中打印 $this->upload 实例的类名来检查它是否工作。 print get_class($this->upload); 应该显示 MY_upload
    • 再次感谢!我将文件保存为 My_upload 而不是 MY_Upload。它现在在这两个地方都能正常工作。再次感谢您的帮助。
    【解决方案2】:

    您知道,如果您以字符串形式接收 Base64 编码图像,则无需使用 Upload 类。

    相反,您只需使用 base64_decode 对其进行解码,然后使用 fwrite/file_put_contents 保存解码后的数据...

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

    信用:http://board.phpbuilder.com/showthread.php?10359450-RESOLVED-Saving-Base64-image.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多