PHP move_uploaded_file() 错误?

Posted

技术标签:

【中文标题】PHP move_uploaded_file() 错误?【英文标题】:PHP move_uploaded_file() error? 【发布时间】:2011-03-30 22:15:28 【问题描述】:

我使用以下代码,它成功地在我的本地机器上上传文件。它在我的本地机器上显示“上传成功”。

// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );

if( $moved ) 
  echo "Successfully uploaded";         
 else 
  echo "Not uploaded";

但是当我在我的在线服务器上使用此代码时,它不会上传文件,只是显示消息“未上传”。

我如何知道问题出在哪里,如何才能将实际问题显示给用户?

【问题讨论】:

网络服务器上有图片文件夹吗?该文件夹是只读的,还是可以写入? 因为FileZilla可以写这个目录,不代表你的web服务器也可以写。 没有。您应该阅读错误消息并解决问题。 “如何”是另一个问题。可以回答的。但是您必须了解非常基本的规则:没有错误消息,您就是盲人,聋子和哑巴。你唯一的愿望和努力应该是得到错误信息。我够清楚了吗? 程序员不应该信任。不是对说了些什么的客户,也不是来自 SO 的志愿者,也不是他自己。但只有程序员可以信任的错误消息。 【参考方案1】:

修改代码如下:

// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );

if( $moved ) 
  echo "Successfully uploaded";         
 else 
  echo "Not uploaded because of error #".$_FILES["file"]["error"];

它将为您提供以下错误代码值 1 到 8 之一:

UPLOAD_ERR_INI_SIZE = 值:1;上传的文件超过了 php.ini 中的 upload_max_filesize 指令。

UPLOAD_ERR_FORM_SIZE = 值:2;上传的文件超出了 html 表单中指定的 MAX_FILE_SIZE 指令。

UPLOAD_ERR_PARTIAL = 值:3;上传的文件只上传了一部分。

UPLOAD_ERR_NO_FILE = 值:4;没有上传文件。

UPLOAD_ERR_NO_TMP_DIR = 值:6;缺少一个临时文件夹。在 PHP 5.0.3 中引入。

UPLOAD_ERR_CANT_WRITE = 值:7;无法将文件写入磁盘。在 PHP 5.1.0 中引入。

UPLOAD_ERR_EXTENSION = 值:8; PHP 扩展停止了文件上传。 PHP 不提供确定是哪个扩展名导致文件上传停止的方法;使用 phpinfo() 检查加载的扩展列表可能会有所帮助。

【讨论】:

什么是错误 5? @Dan 根据 php manual ,错误 5 没有记录。个人没遇到过。【参考方案2】:

试试这个:

$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/";

if (is_dir($upload_dir) && is_writable($upload_dir)) 
    // do upload logic here
 else 
    echo 'Upload directory is not writable, or does not exist.';

这将立即标记任何文件权限错误。

【讨论】:

表示“上传目录不可写,或不存在。”怎么解决的,请解释一下? @SignoffTeamz 使上传目录可写,如果不存在则创建。 在 Linux 中使用 chmod/chown 来获取文件权限在 Web 开发教程中没有得到足够的介绍。我发现 776(不是最佳实践,最像 775)解决了大多数权限问题。将 -R 选项与 chmod 一起使用,以确保将权限传递给目录和目录中的文件。如果使用 apache2,Chown 应该将 www-data 作为所有者组,并将您的用户名作为所有者。您应该将自己添加到用户组 www-data,以便在该文件夹中继承来自服务器的权限以进行测试。【参考方案3】:

检查网络服务器是否有权限写入“images/”目录

【讨论】:

我可以使用FileZilla手动上传此文件夹中的文件,这意味着它有权限。还有其他可能吗? FileZilla 不能证明 Web 服务器有权限。 Web 服务器很可能在与您不同的用户下运行。要确保它有权限,只需将权限设置为 777,然后测试。这应该证明是权限问题还是其他问题。 上传了 2 mb 的文件但没有上传 5 mb 的文件时发生了什么?这两个文件都是文件的pdf类型。那么如何从服务器获取确切的错误消息。所以我们可以知道确切的问题。 所以我检查了 phpinfo 函数,其中 upload_max_filesize 为 2mb,所以我认为这可能是问题,所以我会增加大小并再次检查【参考方案4】:

我怎么知道问题出在哪里

简单。参考网络服务器的错误日志。

如何才能将实际问题显示给用户?

永远不要这样做。 普通用户对此错误一无所知。 恶意用户不应该得到任何反馈,尤其是信息量很大的错误消息。

只显示一个带有借口的页面。

如果您无权访问服务器的错误日志,您的任务会变得更加复杂。 有几种方法可以与错误消息取得联系。

要在屏幕上显示错误消息,您可以将这些行添加到代码中

ini_set('display_errors',1);
error_reporting(E_ALL);

或制作自定义错误日志文件

ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');

还有其他一些方法。 但是您必须了解,如果没有实际的错误消息,您将无法移动。在黑暗中很难失明

【讨论】:

嗯,在开发站点上显示错误是可以的。并非总是可以将错误重定向到日志文件(例如在共享主机上)。 @Pekka 我们说的是现场自动取款机。而且,老实说,应该立即放弃这样的托管。【参考方案5】:

move_uploaded_file() 将返回:

    FALSE 如果文件名无效 FALSEissue a warning 如果 apache 进程没有对源或目标目录的读/写权限,则在错误日志中

PHP 错误日志

我的 php 错误日志位于:/var/log/httpd/error_log 并出现以下错误:

警告:move_uploaded_file(images/robot.jpg):无法打开流:第 78 行 /var/www/html/mysite/mohealth.php 中的权限被拒绝

警告:move_uploaded_file(): Unable to move '/tmp/phpsKD2Qm' to 'images/robot.jpg' in /var/www/html/mysite/mohealth.php on line 78

move_uploaded_file() 尝试将文件从临时目录移动到目标目录。当 apache 进程试图移动文件时,它无法读取临时目录或写入目标目录。

    查找正在运行 Apache(Web 服务器)的用户 通过此命令检查哪个用户正在运行 apache 服务:ps aux | grep httpd。第一列是用户名。

    检查临时目录的读取权限:您可以通过在 php 页面中调用 echo sys_get_tmp_dir(); 来找到临时目录的路径。然后在命令行发出ls -ld /tmp/temporary-dir,看看apache用户是否有权限阅读这里

    检查目标目录的写入权限: issue ls -ld /var/www/html/destination-directory 以查看 apache 用户是否有权在此处写入

    根据需要使用chownchgrp 添加权限

    重启 Apache 使用 sudo service httpd restart

【讨论】:

如何在windows中查看用户? 问题已通过关键字“source”解决。看一下:“如果 apache 进程没有对‘源’或目标目录的读/写权限,move_uploaded_file() 将返回 FALSE 并在错误日志中发出警告。”因此,仅授予项目目录的所有权限是不够的,还应授予源文件位置的所有权限。【参考方案6】:

您检查文件是否上传正常?也许您超过了 max_post_size 或 max_upload_filesize。使用 FileZilla 登录时,您正在复制文件,当通过 PHP wiritng 上传此文件来自运行 apache(例如 www-data)的用户时,请尝试将 chmod 755 用于图像。

【讨论】:

【参考方案7】:

或运行 suexec 并且永远不必再次更改权限。

【讨论】:

【参考方案8】:

php.ini 中搜索 upload_max_filesizepost_max_size。我遇到了同样的问题,解决方案是将这些值更改为大于文件大小的值。

【讨论】:

【参考方案9】:

请检查您的form 标签是否具有此属性:

enctype="multipart/form-data"

【讨论】:

【参考方案10】:
$uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/';
$profic = uniqid(rand()).$_FILES["pic"]["name"]; 

if(is_uploaded_file($_FILES["pic"]["tmp_name"]))

    $moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic);
    if($moved)
    
        echo "sucess";
    
    else
    
        echo 'failed';
    

【讨论】:

【参考方案11】:

在虚拟主机上检查您的disk quota

如果超过配额,move_uploaded_file 返回错误。

PS : 我找这个很久了:)

【讨论】:

【参考方案12】:

请检查权限“images/”目录

【讨论】:

【参考方案13】:

我遇到了错误 6 的一个非常晦涩和烦人的原因。 在玩弄了一些 NFS 挂载的卷之后,上传开始失败。 问题通过重启服务解决

systemctl restart php-fpm.service
systemctl restart httpd.service

【讨论】:

以上是关于PHP move_uploaded_file() 错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 move_uploaded_file() 时如何在 PHP 中创建目标(文件夹)?

PHP文件上传move_uploaded_file不起作用

PHP/IIS copy()/move_uploaded_file() 无法打开流:权限被拒绝警告

PHP move_uploaded_file() 错误?

PHP中move_uploaded_file问题 报错

move_uploaded_file 不工作我正在使用 php 5.6.25