PHP move_uploaded_file()函数失败,我不知道原因。

10

这是我的代码:

$uploaddir = '/temp/';
$uploadfile = $uploaddir.basename($_FILES['file']['name']);

if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile))
    send_OK();
else
    send_error("ERROR - uploading file");

我尝试过使用ftp_fput、ftp_put、move_uploaded_file、rename、copy等方法上传文件,但似乎都无法正常工作。

我不明白问题出在哪里,因为move_uploaded_file仅返回true或false,没有错误代码。

求助?


对于已安装Avast的用户,可以查看此答案:https://stackoverflow.com/a/59223789/10539212。 - Phantom1412
7个回答

18

你确定目标目录对于world用户有写入权限吗?也就是在权限表示中的第三个数字?php上传的文件所有者和所属组为www-data

你可以通过以下方式改变所有权:

[sudo] chown -R www-data folder // change owner
[sudo] chown -R www-data:www-data folder // change group and owner

你说得对,我已经解决了,嗯...不是我自己解决的,我打电话给托管服务器技术支持告诉他们我的问题,显然,他们没有给PHP(www-data)或其他权限...在他们更改后,一切都很好! - eladyanai
@rjv chown: 无效用户: www-data'` - undefined

14

我不知道原因

但你必须知道。

这就是错误消息的作用。当发生错误时,您是否看到任何错误消息?如果没有,则需要检查错误日志。

请将以下一行代码添加到您的代码顶部。

error_reporting(E_ALL);

如果这是您的本地服务器(而不是线上服务器),那么还有一个

ini_set('display_errors',1);

这样你就可以在屏幕上看到错误了。

对于文件上传,你需要先检查$_FILES['file']['error']。如果不是0,请参考手册页面获取实际消息。


$_FILES['file']['error'] = 0警告:move_uploaded_file(/temp/754327953-129265952-content):无法打开流:C:\inetpub\wwwroot\LocalUser\notebook\server\UploadFile.php的目录或文件不存在,第16行警告:move_uploaded_file():无法将'C:\ Windows \ Temp \ phpCC2E.tmp'移动到'/ temp / bla.txt',位于C:\ inetpub \ wwwroot \ LocalUser \ notebook \ server \ UploadFile.php的第16行。 - eladyanai
看!它把一切都讲清楚了! :) 感受错误消息的力量!文件目标似乎出了些问题。它正在尝试打开一个奇怪的文件 /temp/754327953-129265952-content。试着使用另一个目标文件夹? - Your Common Sense
嗯...我猜是这样,因为我不明白... 我从警告文件名754327953-129265952-content中编辑了一个小部分,改成了bla.txt,但我不理解"failed to open stream: No such file or directory in"的部分。我该怎么办? - eladyanai
你的磁盘上有一个 C:\temp\ 目录吗? - Your Common Sense
问题在于这是一个远程服务器(在我的大学),所以我不知道目录是否存在或是否存在问题。 我唯一能做的就是使用FTP客户端上传一个PHP文件,然后使用它... - eladyanai

4

当我使用move_uploaded_file时,遇到了类似的问题。文件上传失败,并且错误代码为$_FILES['filename']['error']的情况也发生了。

原来,文件名需要与目标目录中的名称不同。如果有相同的文件名,move_uploaded_file将无法处理它们。


2

我也遇到了这个问题,请注意以下内容:

move_uploaded_file() 能够在安全模式和 open_basedir 环境下使用。但是,只有目标路径会受到限制,以允许移动文件名可能与此类限制冲突的上传文件。move_uploaded_file() 通过仅允许移动通过 PHP 上传的文件来确保此操作的安全性。

如果您尝试将文件移动到网站基本目录之外,这些设置可能会导致上传失败。


2

您是否检查了文件大小限制?导致崩溃的原因之一可能是您正在尝试上传大于配置中限制的文件大小。请查看php.ini中的配置变量“upload_max_filesize”并检查文件大小。


1
除了权限之外,一定要检查服务器上是否有足够的磁盘空间。如果没有,move_uploaded_file() 将会失败并显示错误代码 0。

0

你尝试激活了error_reporting吗?

如果允许文件上传,你应该检查你的php-config。


谢谢您的快速评论。这是我在phpinfo中看到的内容:file_uploads=On,max_file_uploads=20,upload_max_filesize=2M,upload_tmp_dir=C:\Windows\Temp。关于error_reporting,我刚刚通过您的帖子发现了它,所以我正在处理它... 另外,我上传的文件很小(最大10kb)。 - eladyanai
由于我正在使用大学远程服务器,我没有权限访问 c:\Windows\Temp 文件夹。这是 PHP INI 文件中的值。我请求他们将其更改为我拥有权限的路径,结果成功了... 感谢您的时间!你和 @Col. Shrapnel。 - eladyanai

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