Как я могу загрузить ZIP-файл с помощью php? - PullRequest
3 голосов
/ 22 апреля 2011

Я хочу, чтобы люди могли загружать 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";
  }

1 Ответ

3 голосов
/ 22 апреля 2011

Вы говорите, что ваша форма загрузки перенаправляет после загрузки?Помните, что PHP удаляет все загруженные файлы при выходе из скрипта, если вы не предприняли шаги для сохранения файла.Если ваша форма отправляет (скажем) «upload.php», который затем перенаправляет на «handle_upload.php», вы должны фактически обработать загрузку в сценарии «upload.php», в противном случае файл пропал.

Также не доверяйте параметрам ['type'] и ['name'] в массиве $ _FILES.Это предоставленные пользователем данные и могут быть легко подорваны.Вы также используете предоставленное пользователем имя файла для хранения файла на вашем сервере.Ничто не говорит, что пользователь не может взломать форму загрузки и вызвать свой файл "../../../../etc/passwd" с типом mime "application.zip".Ваш сценарий с радостью примет это и перезапишет файл пароля вашего сервера.

Правильный способ обработки загрузок с проверкой ошибок:

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 ...
}
...