move_uploaded_file,返回false但仍在工作且无法正确移动

时间:2012-02-20 21:27:44

标签: php

我将图片从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

2 个答案:

答案 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