我将图片从Android应用程序发送到服务器。问题是图像没有移动到正确的路径,而只是在当前目录(仅存储该PHP脚本)。我在本地服务器和网络服务器上测试了这些代码,得到了相同的结果任何人都可以找到问题。
本地服务器:XAMPP 1.7.7
我的PHP脚本:
<?php
$base=$_REQUEST['image'];
$Username=$_REQUEST['Username'];
$binary=base64_decode($base);
header('Content-Type: bitmap; charset=utf-8');
$file = fopen($Username.'.png', 'w');
fwrite($file, $binary);
$uploadFilename = '/htdocs/android/ProfileImage/';
$tr =move_uploaded_file($_FILES[$file]['tmp_name'], $uploadFilename);
if($tr)
echo 'true';
else
echo 'false';
echo 'Successfully Uploaded';
?>
在本地服务器中显示输出和错误
严格标准:资源ID#3用作偏移量,在第12行的C:\ xampp \ htdocs \ android \ uploadSimage.php中转换为整数(3)
注意:未定义的偏移量:第12行的C:\ xampp \ htdocs \ android \ uploadSimage.php中的3
falseSuccessfully Uploaded
在网络服务器中显示输出和错误
注意:未定义的偏移量:C中的3:第12行的... \ uploadSimage.php
falseSuccessfully Uploaded
答案 0 :(得分:1)
move_uploaded_file()期望第二个参数是表示上传的新路径和文件名的字符串。目前,您只传递一条路径。我也质疑路径是否正确。它必须是完整路径或相对路径。
您还错误地使用了$_FILES
数组。您是通过在base64中对其进行编码并通过URL的查询字符串传递来上传图像的吗?或者您实际上是使用multipart/form-data
文件上传字段上传它吗?
如果您上传的文件属于名为image
的上传字段,那么您可以访问此文件:
$origname = $_FILES['image']['name']; // the name from the client device
$temppath = $_FILES['image']['tmp_name']; // the temp location on the PHP server
$error = $_FILES['image']['error']; // > 0 if there was an error
$size = $_FILES['image']['size']; // size of the file
$type = $_FILES['image']['type']; // mime type, cannot be trusted though
然后你会这样移动:
// Be careful using the original file name.
// If the user uploads a file with a .php extension, they may be
// able to run PHP code on your server if they can access the upload folder
// You should either generate a random file name or remove the extension
// IF THE DESTINATION FILE EXISTS, IT WILL BE OVERWRITTEN
$newPath = '/home/yoursite/htdocs/uploads/' . $origname;
$moved = move_uploaded_file($_FILES['image']['tmp_name'], $newPath);
if ($moved) {
echo "File was moved successfully.";
} else {
echo "Failed to move file.";
}
修改强>
如果您实际上是通过在base64中对其进行编码并通过URL发送来上传图像,那么您根本不需要move_uploaded_file
;在这种情况下,您可以将解码后的内容写入您喜欢的任何位置。请注意,URL的长度可能会受到限制,因此通过base64在URL中发送图像可能不是一个好主意。
编辑2:
要对后续答案中的问题发表评论:仅当您尝试移动的文件使用HTTP POST方法上载上传到PHP时,才应使用php函数move_uploaded_file()。它会进行内部检查,以查看您尝试移动的文件是否已上传到PHP。如果不是,那么它将不会移动文件。因此,您不应该使用move_uploaded_file()
,因为您确认是通过网址上传图片。
由于PHP脚本的路径为C:\xampp\htdocs\android
,因此根路径为C:\
。服务器根目录与您的Web根目录或文档根目录不同,它们都与您的公共目录相关。每当您处理使用PHP读/写文件时,都使用完整的服务器路径(相对于C:\
或/
)。
鉴于新的事实,尝试使用这样的代码来“上传”图像:
<?php
$base = (isset($_REQUEST['image'])) ? $_REQUEST['image'] : '';
$Username = (isset($_REQUEST['Username'])) ? trim($_REQUEST['Username']) : '';
$binary = @base64_decode($base);
if (empty($Username)) {
die('no username specified');
}
if (!$binary) {
// data was not in base64 or resulted in an empty string
die('invalid image uploaded');
}
$basePath = 'C:\\xampp\\htdocs\\android\\ProfileImage\\';
$imagePath = $basePath . $Username . '.png';
$file = @fopen($imagePath, 'w+');
if (!$file) {
die('failed to open ' . $imagePath . ' for writing');
}
fwrite($file, $binary);
fclose($file);
echo 'Successfully Uploaded';
请务必采取必要的预防措施,以便我无法为其他用户上传图片。
答案 1 :(得分:0)
根据本文档http://php.net/manual/en/function.move-uploaded-file.php,此问题的另一个原因是无效的文件名,如果您的文件名位于 move_uploaded_file(字符串$ filename,字符串$ destination)无效 此函数返回false