【问题标题】:PHP file upload not saving filePHP文件上传不保存文件
【发布时间】:2013-08-23 21:16:24
【问题描述】:

我想写一个 PHP 上传器,它将文件保存到我的 FTP 上。

我找到了这个脚本:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

我在最大文件大小值中添加了 0,因为我想使用 160kb 的图像进行测试。

一切正常。它甚至说:

Upload: bier15291.jpg
Type: image/jpeg
Size: 158.26171875 kB
Temp file: /mnt/shared/tmp/php_0aOep
Stored in: upload/bier15291.jpg

但我无法在我的 FTP 上找到该文件。

我做错了什么?

【问题讨论】:

  • 绝对确定upload/目录有写权限?
  • 那么这个问题解决了吗?如果是这样,您应该选择一个答案或自己添加一个并选择那个。

标签: php file upload ftp save


【解决方案1】:

请检查 move_uploaded_file 的返回值。如果文件名不是有效的上传文件或移动文件内容出错,move_uploaded_file 将返回 false。

【讨论】:

  • 代码运行良好。当我测试它时,它会按预期上传文件,之后我确保了写入权限并将$_FILES["file"]["size"] &lt; 20000) 更改为更正常/更大的值:-)
【解决方案2】:

看看这个: http://www.php.net/manual/en/features.file-upload.errors.php 您在尝试移动文件时需要进行一些错误处理,因为目前您只在实际尝试移动文件之前检查IF $_FILES["file"]["error"] &gt; 0

因此,您的代码仅在您移动临时文件之前确认临时文件没有错误。

考虑来自http://www.php.net/manual/en/function.move-uploaded-file.php的这些陈述

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

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

因此,您在使用临时文件之前正确检查是否一切正常且没有错误,但您还需要从 move_upload_file() 函数中捕获错误以确保移动是 TRUE 或 FALSE。

执行类似的操作(我刚刚修改了您的代码以在 move_uploaded_file() 周围添加一个 IF)

   if (file_exists("upload/" . $_FILES["file"]["name"]))
     {  
       echo $_FILES["file"]["name"] . " already exists. ";
     }
   else
     {
       if (move_uploaded_file($_FILES["file"]["tmp_name"],
       "upload/" . $_FILES["file"]["name"]))
         {
           echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
         }
       else
         {
           //output the errors here (ie using $_FILES["file"]["error"])
         }
      }

然后错误数组应该输出出了什么问题。即(可能)UPLOAD_ERR_CANT_WRITE。然后,这将为您指出问题所在,并且无论如何都可以在您的代码中使用,因此您的脚本会优雅地失败,而不是什么都没有发生(不应该有什么都没有发生的情况!)

【讨论】:

    【解决方案3】:

    所以解决办法是设置权限0775...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多