我必须上传我从android应用程序收到的base64编码图像.我正在使用php codeigniter框架.在搜索论坛时,此链接上的问题如何在codeigniter中上传base64encoded图像与我的相同,但解决方案对我不起作用.
这是我写的代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到"你没有选择要上传的文件"
谢谢你的时间.
发生错误是因为codeigniter的上传库将调查$_FILES超全局并搜索您在do_upload()调用时提供的索引.
此外(至少在版本2.1.2中)即使你要设置$ _FILES超全局来模仿文件上传的行为它也不会通过,因为上传库使用is_uploaded_file来检测那种对超全局的篡改.您可以在system/libraries/Upload.php:134中跟踪代码
我担心你将不得不重新实现大小检查和文件重命名和移动(我会这样做),或者你可以修改codeigniter以省略该检查,但它可能使以后升级框架变得困难.
将$ 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'],
);
Run Code Online (Sandbox Code Playgroud)修改上传库.您可以使用codeigniter内置的扩展本机库的方式,并定义My_Upload(或您的前缀)类,复制粘贴do_upload函数并更改以下行:
public function do_upload($field = 'userfile')
Run Code Online (Sandbox Code Playgroud)
至:
public function do_upload($field = 'userfile', $fake_upload = false)
Run Code Online (Sandbox Code Playgroud)
和:
if ( ! is_uploaded_file($_FILES[$field]['tmp_name']) )
Run Code Online (Sandbox Code Playgroud)
至:
if ( ! is_uploaded_file($_FILES[$field]['tmp_name']) && !$fake_upload )
Run Code Online (Sandbox Code Playgroud)
并在您的控制器中,使用流动参数调用do_upload():
$this->upload->do_upload('userfile', true);
Run Code Online (Sandbox Code Playgroud)