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 消失的主要内容,如果未能解决你的问题,请参考以下文章

PHP文件上载

PHP中move_uploaded_file问题 报错

php 使用$_FILES 能否获得上传文件的绝对地址

php文件上传漏洞代码只允许上传图片

PHP文件上传代码用法

php上传文件(上传后显示图片)