【问题标题】:move_uploaded_file failuremove_uploaded_file 失败
【发布时间】:2011-04-20 20:09:31
【问题描述】:

有人可以帮我理解为什么这会返回错误吗?

if ((move_uploaded_file($_FILES[$field]['tmp_name'], $path))) {

如,潜在原因。我检查了变量是否正确,并且检查了目标文件夹 777 的权限。

干杯!

对于那些想要查看 var_dump ($_FILES) 的人;

array(1) { ["image"]=>  array(5) { ["name"]=>  string(14) "accountile.png" 
["type"]=>  string(9) "image/png" ["tmp_name"]=>  string(14) "/tmp/php28IQhv" 
["error"]=>  int(0) ["size"]=>  int(394) } }

【问题讨论】:

  • 我的第一个想法是询问 $field 是否设置正确,即您是否指定了正确的路径名。然后我会问同样的 $path。尝试 var_dumping 他们每个人。
  • 安装了 Avast 的可以查看这个答案:stackoverflow.com/a/59223789/10539212>
  • 对我来说这是错误的路径,100%检查服务器上是否存在路径非常重要,当我将路径上传到远程服务器时,我根据本地服务器路径放置路径我得到了这个错误。

标签: php image


【解决方案1】:

我已经检查了变量

不检查变量,但检查错误消息。
这是您唯一需要的。
在代码顶部添加这些行

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

看看它说了什么。
如果 move_uploaded_file 失败,它将总是引发错误并提供详细说明
您不会相信,但阅读错误消息是比您之前尝试过的猜测更有效的方法来发现问题

我不敢相信没有人提到它。

【讨论】:

  • 很高兴知道,我从来没有遇到过 move_uploaded_file 的问题,所以我从来不需要知道。
  • move_uploaded_file() 很可能是由目标文件夹/目录中的权限问题引起的错误/失败。是的,您可以通过此答案查看错误消息以检查错误消息,而不是检查变量是否有错误。
  • 虽然启用警告确实是一个好方法,但move_uploaded_file 并不总是会创建错误消息。特别是,如果filename 未指向有效文件,则会创建 no 警告。 The PHP manual states如果filename不是有效的上传文件,则不会发生任何操作,move_uploaded_file()将返回FALSE
【解决方案2】:

使用move_uploaded_file,您不需要 777 权限。 $path 的输出是什么?您是否验证了$path 存在?您是否验证了$field 存在?

$field 或 $path 不存在,或者 open_basedir 有效是我的猜测。

open_basedir 限制是否启用?这可能会阻止上传文件的目的地被写入。在您的 php.ini 中查找 open_basedir,如果指定了路径,则它已启用,您想查看上传文件的目标路径是否在此路径内。如果是,那就是它失败的原因。

更新

$path 不能是 URL,它必须是本地路径,例如 /home/user/public_html/

【讨论】:

  • $path 和 $field 返回预期的字符串。如果有帮助,我可以发布最新的输出。
  • @Yoi 你知道 $path 需要是文件名,而不是路径,对吧?
  • open_basedir 在 phpinfo 中没有值
【解决方案3】:

不要使用

$path = "http://www.barbadostravelbuddy.co.uk/demo/images/carhire
    /accountile10420103260403000000pm.png"

但是

$path = "/home/sites/barbadostravelbuddy.co.uk/public_html/demo/images/carhire/
    accountile10420103260403000000pm.png"

它必须是系统上的路径,而不是 URL。

【讨论】:

  • 我试过 /public_html/demo/images/carhire 没有用。我的目录结构是 root > public_html > demo > images > carhire
  • 好的。尝试在该目录中执行 mkdir (php.net/manual/en/function.mkdir.php)。这将检查目录是否正确以及您是否拥有该目录的权限。
  • 那你要么没有权限,要么你的路径不正确。你能做一个 phpinfo() 并给我们_SERVER["DOCUMENT_ROOT"] 吗?你能给我们目录的权限吗?
  • document_root 是 /home/sites/barbadostravelbuddy.co.uk/public_html/ 并且权限是 755
  • 那你为什么告诉“我的目录结构是root > public_html > demo > images > carhire”?这不是...答案已更新为正确的路径。
【解决方案4】:

您是否编辑了 php.ini 以确保 upload_tmp_dir 指向临时目录?

【讨论】:

    【解决方案5】:

    检查:

    enctype="multipart/form-data"
    

    在表单本身内部,没有它,文件上传根本无法工作。

    【讨论】:

      【解决方案6】:

      您是否检查了临时上传文件夹的权限?

      如果你这样做,php 会告诉你什么:

      var_dump($_FILES);
      

      【讨论】:

        【解决方案7】:

        基本调试步骤:

        • print_r($_FILES) 是什么样的?
        • 源文件真的存在吗?
        • 文件上传的“错误”标志是否为零(执行 print_r 时将可见)
        • 目标$path 是什么样的?
        • 您是否在目标路径中指定了完整的文件名?

        我的猜测是$path 只是文件夹的路径,而不是完整的文件名。

        更新:您需要将 文件系统路径 指定为 $path。

        【讨论】:

        【解决方案8】:

        Loïc Février,谢谢你,你为我节省了很多时间!

        这是我的部分... 在上传过程中打印可能的错误。

        首先创建目录 Uploader/UploadedFiles 然后使用下面的代码...

        $destination=$_SERVER[DOCUMENT_ROOT]."/Uploader/UploadedFiles/" . $_FILES["file"]["name"];
        
        if(move_uploaded_file($_FILES["file"]["tmp_name"],  $destination)){
           echo ("Stored in".$_SERVER[DOCUMENT_ROOT]."/Uploader/UploadedFiles/".$_FILES["file"]["name"]);
        }else{
           $html_body = '<h1>File upload error!</h1>';
           switch ($_FILES[0]['error']) {
           case 1:
              $html_body .= 'The file is bigger than this PHP installation allows';
              break;
           case 2:
              $html_body .= 'The file is bigger than this form allows';
              break;
           case 3:
              $html_body .= 'Only part of the file was uploaded';
              break;
           case 4:
              $html_body .= 'No file was uploaded';
              break;
           default:
              $html_body .= 'unknown errror';
           } 
           echo ($html_body);
        }
        

        【讨论】:

        • 使用 $_SERVER[DOCUMENT_ROOT] 也为我修复了它。
        【解决方案9】:

        $path 必须是文件名,而不是目录路径。

        【讨论】:

          【解决方案10】:

          我也遇到了同样的问题。

          如果您的错误提示“无法打开流:权限被拒绝”,这意味着 PHP 服务器 无法在您的目标目录中创建新文件。

          一旦您在目录上设置了 Linux 权限(听起来就像您将其设置为 777),您应该将该特殊权限授予 PHP 服务器。

          如果您的文件夹名为“uploads”,您应该 cd 到上一个目录并使用下一个命令:

          chcon -R -t httpd_sys_rw_content_t uploads
          

          这绝对解决了我的问题。

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2019-06-22
            • 2016-07-25
            • 2013-01-17
            • 2023-01-22
            • 1970-01-01
            • 2013-01-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多