如何使用PHP上传zip文件?

3
我希望用户能够将zip文件上传到我的服务器。我有一个上传表单,它会重定向到上传页面。我能够成功地上传图片(png和jpg),但每当我尝试上传zip文件时,我会收到几个“未定义索引错误”(第4-8行)。这是我的代码。如果你想查看网站,请访问gregsminecraft.dyndns.org:25566/file.php。编辑:我认为它不接受大的zip文件,因为我用一个较小的文件试过了,它可以工作。是否有一种方法可以接受更大的zip文件?
 if ((($_FILES["file"]["type"] == "application/zip")
|| ($_FILES["file"]["type"] == "application/x-zip-compressed")
|| ($_FILES["file"]["type"] == "multipart/x-zip")
|| ($_FILES["file"]["type"] == "application/x-compressed")
|| ($_FILES["file"]["type"] == "application/octet-stream"))
&& ($_FILES["file"]["size"] < 20971520))
  {
  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";
  }

我刚刚测试了您提供的URL,并获得了以下输出:上传:iPhone intro.zip类型:application/x-zip-compressed大小:158.626953125千字节临时文件:/private/var/tmp/php0ZyEoi存储在:upload/iPhone intro.zip - Brian Driscoll
1个回答

3
你说你的上传表单在上传后会重定向?请记住,PHP 在脚本退出时会删除任何已上传的文件,除非你采取措施保留该文件。如果你的表单 POST 到(比如)"upload.php",然后重定向到 "handle_upload.php",你必须在 "upload.php" 脚本中实际处理上传,否则文件就没了。
此外,不要相信 $_FILES 数组中的 ['type']['name'] 参数。这是用户提供的数据,很容易被篡改。你还使用用户提供的文件名将文件存储在你的服务器上。没有什么能阻止用户黑掉上传表单并使用 "application.zip" 的 mime 类型调用他们的文件 "../../../../etc/passwd"。你的脚本将欣然接受它并覆盖你服务器的密码文件。
正确处理上传的方法,需要进行错误检查,如下所示:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
     if (isset($_FILES['file'])) {
          if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
                ... file was succesfully uploaded, process it
          } else {
               ... file upload failed, output error message, etc...
     } else {
        ... no upload at all, not even an attempt
     }
} else {
   .... not in a POSt environment, so can't possibly have a file upload ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接