PHP上传问题,错误代码为0,但move_uploaded_file()函数返回false。

4
PHP上传问题,得到错误码0,但是move_uploaded_file()返回false。当我打印出$_FILES时,得到以下内容:
Array ( [uploadedfile] => Array ( [name] => flashlog.txt [type] =>
text/plain [tmp_name] => /tmp/php0XYQgd [error] => 0 [size] => 3334 ) ) 

我正在使用一份基础的HTML/PHP教程,这让我认为这可能是一个服务器问题。我检查了php.ini文件,其中upload_max_filesize:2M,post_max_size:8M。所以我真的很困惑,因为我认为0的错误告诉我它已经成功了。

我使用的代码是:

<?php

// Where the file is going to be placed 
$target_path = 'Test/';

$target_path = $target_path. basename( $_FILES['uploadedfile']['name']); 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
{
 echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
 " has been uploaded";
} 
else
{
 echo "There was an error uploading the file, please try again!";
 echo print_r($_FILES);
}
?>

你遇到错误的代码是什么?顺便提一下,请使用四个空格进行缩进以正确格式化代码。 - deceze
你是否提高了错误报告级别?如果目标出现问题,move_uploaded_file 应该会发出警告,告诉你出了什么问题。 - deceze
3个回答

10

move_uploaded_file()如果无法写入目标目录,也会返回false。

我看到大多数处理上传的PHP代码都忽略了一些重要的步骤。上传代码应该执行以下步骤:

  1. 检查$_FILES[]是否存在且填充了正确的条目。
  2. 查看error字段,以查看是否成功传输到服务器,许多代码只检查它是否为0,这意味着它无法向用户返回任何合适的错误信息。
  3. 确保需要移动文件的目标位置确实存在。
  4. 调用move_uploaded_file()来执行移动操作 - 太多人只是进行文件复制,从而绕过了move_uploaded_file()所做的安全检查。

这些是离散的步骤:正如你所看到的,实际上传可能成功,但move_uploaded_file()可能失败。你的问题假设如果后者失败,前者也失败了。

哦,对了:调用move_uploaded_file($_FILES ['uploadedfile'] ['tmp_name'], $destination)。使用$_FILES ['uploadedfile'] ['name']不会起作用。


1
这就是我会回答的。检查你的文件权限。考虑到这是一个移动操作,你可能还需要从源目录中删除它的权限。 - thomasrutter
1
move_uploaded_file()不会有问题删除临时文件,因为它是由与上传的一部分相同的进程调用创建的。 :-) - staticsan
好的,这里有一大堆新手问题,权限设置不正确。谢谢大家。 - MrB
1
有趣的是,权限是我在上传失败时首先查看的东西。我的问题是我写成了 if (move_uploaded_file($_FILES['uploadedfile']['name']) { }。将其更改为 ['tmp_name'] 对我有用。 - Ortund

0

我在我的项目中遇到了同样的错误,你的代码没有任何问题,但是文件名存在问题,比如我无法上传名为("IMAG0889.jpg", "IMAG0892.jpg", "IMAG0893.jpg"等)的图像,它会给我错误0。将文件重命名为("Deep2.jpg", "IMG_20160925_093715_1.jpg")之后,我成功地上传了我的图片文件。因此,请尝试在重命名后上传文件


0

将这一行代码改为 ----
$target_path = $_SERVER["DOCUMENT_ROOT"].'/folder_name/'. basename( $_FILES['uploadedfile']['name']));

这样就可以了 ----
$target_path = $_SERVER["DOCUMENT_ROOT"].'/folder_name/'. $_FILES['uploadedfile']['name']);

这个方法对我很有效。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Dhaval Purohit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接