我想从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)));
}
}
}
但是目标文件夹中没有创建图像 - 错误是什么?
答案 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编码的字符串提交,则没有实际的文件上传; 它只是一个字符串。
所需的逻辑步骤根本与文件上传无关,只是将二进制字符串写入文件,即:
$data = base64_decode($fill);
file_put_contents('/tmp/pic.png', $data);