Загрузка файлов PHP

С помощью PHP можно загружать файлы на сервер.

Создание формы для загрузки файлов

Разрешение пользователям загружать файлы через форму очень полезно.

Смотрите下面的 HTML-форму для загрузки файлов:

<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Имя файла:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>

Обратите внимание на следующую информацию о этой форме:

Атрибут enctype тега <form> определяет, какой тип содержимого следует использовать при отправке формы. Когда форма требует двоичных данных, таких как содержимое файла, используйте "multipart/form-data".

Атрибут type="file" тега <input> определяет, что ввод должен быть обработан как файл. Например, при предварительном просмотре в браузере, вы увидите кнопку "Просмотр" рядом с полем ввода.

Комментарий:Разрешение пользователям загружать файлы представляет собой значительную угрозу безопасности. Пожалуйста, разрешайте только доверенным пользователям выполнять операции по загрузке файлов.

Создание сценария загрузки

"upload_file.php" файл содержит код для загрузки файлов:

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Ошибка: " . $_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 "Сохранено в: " . $_FILES["file"]["tmp_name"];
  }
?>

Используя глобальный массив PHP $_FILES, вы можете загружать файлы с компьютера клиента на удаленный сервер.

Первый параметр - name поля input формы, вторая индекс может быть "name", "type", "size", "tmp_name" или "error". Вот так:

  • $_FILES["file"]["name"] - имя загруженного файла
  • $_FILES["file"]["type"] - тип загруженного файла
  • $_FILES["file"]["size"] - размер загруженного файла в байтах
  • $_FILES["file"]["tmp_name"] - имя временной копии файла, хранящегося на сервере
  • $_FILES["file"]["error"] - код ошибки, вызванной загрузкой файла

Это очень простой способ загрузки файлов. В целях безопасности вы должны добавить ограничения на то, какие пользователи могут загружать файлы.

Ограничения на загрузку

В этом скрипте мы добавили ограничения на загрузку файлов. Пользователь может загружать только .gif или .jpeg файлы, размер файла должен быть меньше 20 kb:

<?php
if ((($_FILES["file"]["type"] == "image/gif"))
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Ошибка: " . $_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 "Сохранено в: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Invalid file";
  }
?>

Комментарий:Для IE, тип файла jpg должен быть pjpeg, для FireFox - jpeg.

Сохранение загруженного файла

В примере в серверной временной папке PHP был создан временный дубликат загруженного файла.

Эта временная копия файла исчезнет после завершения скрипта. Чтобы сохранить загруженный файл, его нужно скопировать в другое место:

<?php
if ((($_FILES["file"]["type"] == "image/gif"))
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Возвратный код: " . $_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";
  }
?>

Upper скрипт проверяет, существует ли этот файл, и если его нет, копирует его в указанную папку.

Комментарий:Этот пример сохраняет файл в новую папку с именем "upload".