【问题标题】:PHP move_uploaded_file() error?PHP move_uploaded_file() 错误?
【发布时间】: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 的志愿者,也不是他自己。但只有程序员可以信任的错误消息。

标签: php file file-upload


【解决方案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() 将返回:

  1. FALSE 如果文件名无效
  2. 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 进程试图移动文件时,它无法读取临时目录或写入目标目录。

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

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

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

  4. 根据需要使用chownchgrp 添加权限

  5. 重启 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
                

                【讨论】:

                  猜你喜欢
                  • 2011-12-08
                  • 1970-01-01
                  • 2023-03-23
                  • 2011-02-06
                  • 2017-09-11
                  • 2013-06-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-10-01
                  相关资源
                  最近更新 更多