PHP文件上传,文件在move_uploaded_files之前从/ tmp消失

时间:2009-11-30 12:35:08

标签: php file upload file-upload

我有一个非常基本的上传脚本,可能直接从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根本就不存在。

14 个答案:

答案 0 :(得分:10)

1)post_max_size和upload_max_filesize的值是否高于您尝试上传的文件的大小?

2)您的上传脚本执行的时间是否比max_execution_time变量的值允许的时间长?

3)我假设您的上传脚本不会消耗尽可能多的内存,因为memory_limit变量允许。当客户端将文件上传到服务器时,服务器可能会在执行此操作时将其中的一部分保留在内存中。我不确定它是否会以某种方式影响php.ini中memory_limit变量的限制。

可以在php.ini和/或.htaccess中或使用ini_set()更改这些变量。

希望有所帮助。

答案 1 :(得分:6)

脚本完成执行后将删除该文件。如果您运行脚本,然后检查/ tmp /文件夹,则无论如何都不会存在该文件。

答案 2 :(得分:1)

我正在尝试http://www.w3schools.com/php/php_file_upload.asp 我偶然发现了同样的错误。

在我的情况下,在$ destination之前添加“./”解决了问题。

bool move_uploaded_file ( string $filename , string $destination )

答案 3 :(得分:1)

我刚刚遇到这个问题,遇到了这个网站的解决方案 - 没有得到它;)

我在查看print_r($_FILES)时收到了正确的信息,但无法执行move_uploaded_file ...

我通过检查$upload_file函数中的move_uploaded_file路径属性来解决了这个问题 - 请确保它是正确的,否则它将无效(我的错误)。

此外,临时位置的文件会自动删除,我认为这是PHP的工作方式。

我希望这会有所帮助。

答案 4 :(得分:1)

也可能是您的目标文件夹不存在或您没有写入权限。

答案 5 :(得分:0)

您是否100%确定文件实际是在/ tmp中创建的?如果您没有写入权限(或脚本运行的用户),文件将不会写入/ tmp但是(我猜)你会在上传过程中看到它,尽管在上传完成时它实际上并不存在。

编辑:$ _FILES ['file'] ['error'] - 值:7;无法将文件写入磁盘。在PHP 5.1.0中引入。所以检查你的PHP版本。如果它低于5.1写入磁盘可能是你的问题。

答案 6 :(得分:0)

我自己也遇到过这个问题。在我的情况下,PHP上传到错误的tmp文件夹。它不是使用域tmp文件夹(在plesk上的虚拟主机中),而是直接上传到OS临时文件夹。

检查临时文件夹的设置

答案 7 :(得分:0)

为了将来参考,当Apache无法访问目标目录时也会发生这种情况(请记住更改ACL !!)。

答案 8 :(得分:0)

我有同样的问题,'tmp_name'会说它存储在'/ private / var / tmp /'中,但文件不存在。

我必须在php.ini中将“E”添加到我的“变量顺序”中 ;是variables_order    默认值:“EGPCS”

希望这有帮助。

答案 9 :(得分:0)

在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"]);

答案 10 :(得分:0)

小心你的$ upload_file。当您连接文件夹路径和上传的文件名时,它可能缺少“/”。

答案 11 :(得分:0)

尝试在以下位置注释掉PrivateTmp = true 在/etc/systemd/system/multi-user.target.wants/apache2.service中 重新启动Apache之后,它将始终使用系统的临时文件夹,而不是每个会话使用相对的临时文件夹。

答案 12 :(得分:-1)

您的form应使用以下标记:

<form method="post" enctype="multipart/form-data" action="...">

multiple/form-data用作enctype

答案 13 :(得分:-2)

您使用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;
}