文件上传为base64编码字符串时出错

时间:2015-08-03 06:52:55

标签: php cakephp

我想从Android设备接收图像,该图像将图像作为Base64编码的字符串发送。这是我的控制器操作代码:

public function  Upload()
{
    if ($this->request->is('post')) {
        $dir= APP.'outsidefiles'; //chane directory for cloud
        $fill = $this->request->data['File'] ;
        $data = base64_decode($fill);
        $im = imagecreatefromstring($data);
        if ($im !== false)
        {
            $nam ='mypic.png';
            move_uploaded_file($im['tmp_name'],$dir.DS.time().$nam);
        }

        //$dir= APP . 'outsidefiles';

        //  $this->request->data['Grade']['Fila']= $File;
        $this->Grade->create();
        if ($this->Grade->save($this->request->data))
        {

            $return = array(
                'Response' =>'1',
                'Body' => 'Data Saved');
            return new CakeResponse(array('body' => json_encode($return, JSON_NUMERIC_CHECK)));

        }
        else
        {
            $return = array(
                'Response' =>'0',
                'Body' => 'Data not saved');
            return new CakeResponse(array('body' => json_encode($return, JSON_NUMERIC_CHECK)));
        }
    }
}

但是目标文件夹中没有创建图像 - 错误是什么?

1 个答案:

答案 0 :(得分:2)

移动上传的文件用于移动上传的文件

这不起作用:

move_uploaded_file("I am not a file upload" , "/put/file/here/path.png");

即使第一个参数指向某个文件,它也不会起作用,因为as stated in the documentation

  

如果filename不是有效的上传文件,则不会执行任何操作,move_uploaded_file()将返回FALSE。

这可以防止这种天真的攻击:

// User input is not safe, it could be e.g.:
$_FILES['example']['tmp_name'] = '/etc/passwd'; 
...
move_uploaded_file(
    $_FILES['example']['tmp_name'], 
    "/web/accessible/location/now-public.txt"
);

从字符串创建的图像不返回数组

这也行不通:

$im = imagecreatefromstring($data);
$im['tmp_name']; <-

as,此函数is an image resource, not an array的返回值。 tmp_name与文件上传有关 - 如果以base64编码的字符串提交,则没有实际的文件上传; 它只是一个字符串

上传base64编码的字符串意味着仅创建文件

所需的逻辑步骤根本与文件上传无关,只是将二进制字符串写入文件,即:

$data = base64_decode($fill);
file_put_contents('/tmp/pic.png', $data);