PHP文件上传不保存文件

时间:2013-08-21 13:14:51

标签: php file upload ftp save

我想写一个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";
  }
?>

我在max filesize值中添加了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上找到该文件。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

考虑来自http://www.php.net/manual/en/function.move-uploaded-file.php

的这些陈述
  

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

     

如果filename是有效的上传文件,但某些文件无法移动   原因,不会发生任何操作,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。这将指出你的问题,并且最好还是在你的代码中,所以你的脚本优雅地失败而不是没有任何事情发生(应该永远不会有任何事情发生!)

答案 2 :(得分:0)

所以解决方案是设置权限0775 ...