PHP 文件上传,文件在 move_uploaded_files 之前从 /tmp 消失
Posted
技术标签:
【中文标题】PHP 文件上传,文件在 move_uploaded_files 之前从 /tmp 消失【英文标题】:PHP File Upload, files disappearing from /tmp before move_uploaded_files 【发布时间】:2010-12-21 15:09:39 【问题描述】:我有一个非常基本的上传脚本,可能直接从 php.net/move_upload_files 功能页面中提取出来。
move_uploaded_file()
失败,因为它在 tmp 文件夹中找不到 tmp 文件。但我知道它被放在那里,但在move_upload_file()
可以在我的脚本中处理它之前被删除。我知道它被放在那里,因为当一个大文件被发布到服务器时,我可以在其中看到一个文件。
还有$_FILES
包含我刚刚上传的文件的正确详细信息。
有没有人知道为什么在我有机会处理临时文件之前从 /tmp 中删除它?
这是我正在使用的基本代码。
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file))
$result['error'] = 'false';
$result['file_loc'] = $upload_file;
else
$result['error'] = 'true';
print_r($_FILES)
的输出看起来像
[userfile] => Array
(
[name] => switchsolo.png
[type] => image/png
[tmp_name] => /tmp/phpIyKRl5
[error] => 0
[size] => 6690
)
但是 /tmp/phpIyKRl5 根本不存在。
【问题讨论】:
请张贴您的 html 表单。我认为问题出在您的 HTML 中。 move_uploaded_file() 给你的确切信息是什么? 请从您的错误日志中发布消息 您是否检查过您传递给move_uploaded_file()
的目标文件夹位置?也许它已经移动在那里了,为什么要检查临时位置?
我已经解决了这个问题,我是个白痴,我把目标文件的路径弄错了,我用棍子打了自己,还戴了一块夹心板,说我是个混蛋,很抱歉浪费大家的时间。
【参考方案1】:
你的form
应该使用这样的标签:
<form method="post" enctype="multipart/form-data" action="...">
将multiple/form-data
用作enctype
。
【讨论】:
不确定,我没有测试过。但根据经验,每次我忘记 enctype="mult..." 时,我都没有任何文件。检查这很容易。使用 Live HTTP 标头或类似标头并查看文件是否已发送。 里面肯定有。【参考方案2】:您是否 100% 确定该文件实际上是在 /tmp 中创建的?如果您没有写权限(或脚本运行的用户),则文件不会被写入 /tmp 但(我猜)您会在上传期间看到它,尽管上传完成时它实际上并不存在。
编辑:$_FILES['file']['error'] - 值:7;无法将文件写入磁盘。在 PHP 5.1.0 中引入。所以检查你的 PHP 版本。如果它低于 5.1 写入磁盘可能是您的问题。
【讨论】:
100% 确定,当我上传较大的文件时,我可以看到它正在创建,但一旦完成,它似乎就消失了。 啊,看看剩下的评论。我们正在运行 5.2,目前,tmp 文件夹为 777【参考方案3】:您错误地使用了move_uploaded_file()
的返回值:
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file))
$result['error'] = 'true';
else
$result['error'] = 'false';
$result['file_loc'] = $upload_file;
【讨论】:
如果函数运行成功,肯定返回TRUE?!【参考方案4】:我自己也遇到过这个问题。就我而言,php 正在上传到错误的 tmp 文件夹。它没有使用域 tmp 文件夹(在 plesk 上的虚拟主机中),而是直接上传到操作系统临时文件夹。
检查临时文件夹的设置
【讨论】:
【参考方案5】:脚本完成执行后文件被删除。如果您运行脚本,然后检查 /tmp/ 文件夹,无论如何该文件都不会存在。
【讨论】:
【参考方案6】:1) post_max_size 和 upload_max_filesize 的值是否高于您尝试上传的文件的大小?
2) 您的上传脚本的执行时间是否超过了 max_execution_time 变量所允许的值?
3) 我假设您的上传脚本消耗的内存没有 memory_limit 变量允许的那么多。当客户端将文件上传到服务器时,服务器可能会在执行此操作时将其中的一些文件保存在内存中。我不确定它是否会以某种方式影响 php.ini 中 memory_limit 变量的限制。
可以在 php.ini 和/或 .htaccess 或使用 ini_set() 中更改这些变量。
希望对您有所帮助。
【讨论】:
每次遇到文件上传问题,关注1或2都解决了。+1【参考方案7】:供将来参考,当 Apache 无权访问目标目录时也会发生这种情况(请记住更改 ACL !!)。
【讨论】:
【参考方案8】:我遇到了同样的问题,“tmp_name”会说它存储在“/private/var/tmp/”中,但该文件不存在。
我必须在 php.ini 中将“E”添加到我的“变量顺序”中 ;变量顺序 默认值:“EGPCS”
希望这会有所帮助。
【讨论】:
【参考方案9】:我正在尝试http://www.w3schools.com/php/php_file_upload.asp 我偶然发现了同样的错误。
在我的例子中,在 $destination 之前添加一个“./”解决了这个问题。
bool move_uploaded_file ( string $filename , string $destination )
【讨论】:
【参考方案10】:我也遇到了这个问题,在这个网站上找到了一个解决方案 - 没有得到它;)
查看print_r($_FILES)
时我得到了正确的信息,但无法执行move_uploaded_file
...
我通过检查move_uploaded_file
函数中的$upload_file
路径属性解决了这个问题 - 确保它是正确的,否则它将无法工作(我的错误)。
此外,临时位置中的文件会自动删除,我认为这就是 PHP 的工作方式。
我希望这会有所帮助。
【讨论】:
+1 表示临时文件在脚本结束后被删除。我还没有做任何 move_upload_file ......它一直在工作。【参考方案11】:也可能是你的目标文件夹不存在或者你没有写权限。
【讨论】:
【参考方案12】:在 move_uploaded_file() 函数之前进行的简单测试:
if (!file_exists("upload"))
if (mkdir("upload"))
echo "Upload directory created!";
else
die( "Invalid upload directory!" );
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
【讨论】:
【参考方案13】:小心你的 $upload_file。当您连接文件夹路径和上传文件的名称时,可能缺少“/”。
【讨论】:
【参考方案14】:尝试注释掉 PrivateTmp=true in 在 /etc/systemd/system/multi-user.target.wants/apache2.service 重新启动 Apache 后,它将始终使用系统的临时文件夹,而不是每个会话的相对文件夹。
【讨论】:
还请至少简要说明该操作完成了什么。以上是关于PHP 文件上传,文件在 move_uploaded_files 之前从 /tmp 消失的主要内容,如果未能解决你的问题,请参考以下文章