【问题标题】:Move_uploaded_file() function is not workingMove_uploaded_file() 函数不起作用
【发布时间】:2013-09-26 13:46:56
【问题描述】:

我正在开发一个网站,我希望用户能够上传文件。所以我正在努力学习如何做到这一点。我研究了一下,它说我必须使用函数 move_uploaded_file()。我像在示例中一样编写代码(更改数据),但它不起作用。请帮助我,我是这些新手。这是我到目前为止所做的:

<!DOCTYPE html>
<html>
   <head>
   </head>
<body>
   <form action="upload_file.php" method="POST" enctype="multipart/form-data">
      <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
      <input type="file"name="file">
      <input type="submit">
   </form>
</body>
<html>

这是upload_file.php:

<!DOCTYPE html>
<html>
  <head>
  <head>
     <body>
        <?php
          $move = "/Users/George/Desktop/uploads/";
          echo $_FILES["file"]['name']."<br>";
          echo $_FILES["file"]['tmp_name']."<br>";
          echo $_FILES["file"]['size']."<br>";
          echo $_FILES['file']['error']."<br>";
          move_uploaded_file($_FILES['file']['name'], $move);
        ?>
     <body>
<html>

【问题讨论】:

  • 每个人都在手册上发布的解决方案,你检查了吗? php.net/manual/en/function.move-uploaded-file.php
  • /Users/George/Desktop/uploads/ 的目录权限是什么?那必须是可写的
  • 我不知道目录权限是什么。你能解释一下吗?
  • 你是在linux还是windows上运行这个网站?
  • 我发现了错误 ($move = "/Users/George/Desktop/uploads/"_.$_FILENAME['file']['name']_;)。现在可以了。谢谢!

标签: php file


【解决方案1】:

该文件将存储在一个临时位置,因此请使用 tmp_name 而不是 name

if (move_uploaded_file($_FILES['image']['tmp_name'], __DIR__.'/../../uploads/'. $_FILES["image"]['name'])) {
    echo "Uploaded";
} else {
   echo "File not uploaded";
}

【讨论】:

  • 您还应该检查函数的返回值。你的目的地的目录权限呢?
  • 不要直接使用给定的文件名将上传文件存储到您的文件系统中。至少对其进行消毒。
  • 只是添加到@Ja͢ck 的评论中,您还应该通过basename() 传递名称,因为虽然PHP 目前保护您,但它是为了与Internet Explorer 兼容而完成的。将来,如果要删除它,那么 Evil Hacker ™ 可以做到curl -F 'file=@example.php;filename=../../../example.php' https://example.com/upload/
  • @CraigFrancis 从引擎中删除 basename 操作将违反 RFC 7578,因此我更新了该部分代码以强制执行此想法。此外,它上面还有一个engine test,以确保它不会被任意从引擎中删除。
【解决方案2】:

这是一个工作示例。

HTML 表单:

<form enctype="multipart/form-data" action="upload.php" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="512000" />
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

PHP 代码:

<?php        
    $uploaddir = '/var/www/uploads/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

    echo "<p>";

    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "File is valid, and was successfully uploaded.\n";
    } else {
        echo "Upload failed";
    }

    echo "</p>";
    echo '<pre>';
    echo 'Here is some more debugging info:';
    print_r($_FILES);
    print "</pre>";
?>

【讨论】:

    【解决方案3】:

    应该是这样的

    move_uploaded_file($_FILES['file']['tmp_name'], $move);
    

    而且您不能将它移动到系统中的任何位置。您只能将其移动到您的项目目录中,该目录必须位于 htdocs 或 www 中,具体取决于您使用的 wampp、lampp 或 vertrgo。

    【讨论】:

    • 我正在使用 mamp,我尝试使用文档,但它仍然无法正常工作。谢谢。
    【解决方案4】:
    $move = "/Users/George/Desktop/uploads/".$_FILES['file']['name'];
    

    就是这样一个。

    move_uploaded_file($_FILES['file']['tmp_name'], $move);
    

    这是两个。

    检查uploads 目录是否可写

    这是三个。

    返回值

    成功时返回 TRUE。

    如果文件名不是有效的上传文件,则不会发生任何操作,并且 move_uploaded_file() 将返回 FALSE。

    如果文件名是一个有效的上传文件,但不能移动一些 原因,不会发生任何动作,并且 move_uploaded_file() 将返回 错误的。此外,还会发出警告。

    查看函数的返回值。

    就是这样。

    【讨论】:

    • 检查上传目录是否可写(非常好!)
    【解决方案5】:

    试试这个

    $ImageName = $_FILES['file']['name'];
    $fileElementName = 'file';
    $path = 'Users/George/Desktop/uploads/'; 
    $location = $path . $_FILES['file']['name']; 
    move_uploaded_file($_FILES['file']['tmp_name'], $location); 
    

    【讨论】:

      【解决方案6】:

      您指的不是保存文件的临时位置

      使用tmp_name 访问该文件。

      您可以随时查看发布的内容:

      echo "<pre>"; 
      print_r($_FILES);
      

      如果您看到这个文件数组,您将对正在发生的事情有更好的理解和想法。

      【讨论】:

      • 那么如果 print_r($_FILES) 打印一个空数组呢?我和OP一样。
      • @Lewistrick 这意味着您可能忘记提及表单的 enctype 属性。参考这个问题:stackoverflow.com/questions/3586919/…
      【解决方案7】:

      尝试使用copy() 函数而不是move_uploaded_file()。它对我有用

      copy($_FILES['file']['tmp_name'], $path);
      

      【讨论】:

        【解决方案8】:

        也许您需要为您的文件授予更多权限。

        假设你的代码在 /var/www/my_project 下

        试试chmod -R 777 /var/www/my_project

        【讨论】:

        • 强烈建议您注意这里的安全风险。如果您确实需要这样做,请将 php 添加到拥有该文件夹的组中并使用 664 而不是 777
        【解决方案9】:

        如果你在windows机器上,上传或写入指定文件夹路径不会有任何问题,除了语法错误。

        但对于 Linux 用户,即使没有可见的语法错误,也有解决此问题的方法。

        首先,我假设你是在 Linux 环境中使用它,你需要上传一些东西到你的公共目录下的项目文件夹中。

        即使您对项目文件夹具有读写权限,最终用户也不会处理 PHP。它可以由www-data 用户或组处理。

        所以为了让这个www-data 获得访问权限 首先输入;

        sudo chgrp "www-data" your_project_folder
        

        一旦完成,如果也没有对以下内容的写入权限;

        sudo chown g+w your_project_folder
        

        这将在 Linux 中发挥作用。

        请不要说这是在 Linux 环境中完成的,运行 phpmyadmin 和 mysql。

        【讨论】:

          【解决方案10】:

          如果文件没有移动,这可能是由于多种原因

          • 检查上传目录的权限,确保其权限至少为0755。
          > find * -type d -print0 | xargs -0 chmod 0755 # for directories find *
          > -type f -print0 | xargs -0 chmod 0666 # for files
          
          • 确保上传目录的所有者和组不是 root ,在这种情况下,您的脚本将无法在那里写入任何内容,因此请将其更改为 admin 或任何非 root 用户。
          chown -R admin:admin public_html      # will restore permission to admin  for folder and files within it 
          chown  admin:admin public_html      # will restore permission to admin  for folder only will skip files
          
          • 检查您的 tmp 目录是否可写,因此打开 php.ini 并检查 upload_tmp_dir = 您的临时目录路径,确保其可写。
          • 尝试copy 函数而不是move_uploaded_file

          【讨论】:

            【解决方案11】:

            这个答案很晚,但它可能会帮助像它帮助我的人

            只需确保您已授予用户对目标文件的权限

            sudo chown -R www-data:www-data /Users/George/Desktop/uploads/

            【讨论】:

            • 我在 Mac 上也遇到了同样的情况。我必须授予权限
            • @谢谢。它对我有很大帮助。
            • 我多久可以踢自己一次。这是其中之一。 ty
            【解决方案12】:

            上传文件的最简单方法

            $FileName = $file_name;
            $path = 'Users/Desktop/uploads/images'; 
            $location = $path . $data['name']; 
            move_uploaded_file($data['temp_name'],$location);
            

            【讨论】:

              【解决方案13】:

              我错过的错误是没有将“enctype=multipart/form-data”作为表单的元素。只是想提醒人们,因为这可能是你的错误

              【讨论】:

                【解决方案14】:

                如果 move_uploaded_file() 对您不起作用并且您没有收到任何错误(例如我的情况),请确保您上传的文件/图像的大小不大于php.ini 中的 upload_max_filesize 值。

                我的 upload_max_filesize 在我的本地主机上的值为 2MB,我无数次尝试上传 4MB 的图像,同时试图找出 move_uploaded_file() 的问题是什么.

                【讨论】:

                  【解决方案15】:

                  始终为图片正确设置文件夹目录,否则图片将无法上传,请检查我的图片上传代码,如果您仍然存在问题,请告诉我将帮助您

                  if (move_uploaded_file($_FILES['profile_picture']['tmp_name'],'../images/manager/'. 
                      $_FILES["profile_picture"]['name'])) {
                        echo "Uploaded";
                  } else {
                        echo "File not uploaded";
                  }
                  

                  【讨论】:

                    【解决方案16】:

                    move_uploaded_file($_FILES['file']['tmp_name'], $path) 移动文件,这意味着临时文件/缓冲区将从原始源中清除。 move_uploaded_file() 可以识别open_basedir。但是,限制仅设置在 to 路径上,以允许移动上传的文件,其中 from path 可能与此类限制冲突。

                    copy($_FILES['file']['tmp_name'], $to_path) 当文件被复制时,复制意味着临时缓冲区(源)未被清理。 $to_path 应该支持覆盖现有文件。

                    【讨论】:

                      【解决方案17】:

                      对我来说,php.ini "upload_max_filesize" 太小了(现在更新并且可以正常工作)。

                      【讨论】:

                        猜你喜欢
                        • 2016-12-14
                        • 2020-11-04
                        • 1970-01-01
                        • 2018-08-18
                        • 1970-01-01
                        • 2016-03-19
                        • 2019-04-09
                        • 2019-05-09
                        • 2016-10-01
                        相关资源
                        最近更新 更多