Загрузка файлов на сервер

Создание формы загрузки

Сделаем HTML-форму для загрузки файла на сервер:

<!DOCTYPE html>
<html>
<body>

<form action="upload.php" method="post"
enctype="multipart/form-data">
  Выберите изображение для загрузки:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Загрузить изображение" name="submit">
</form>

</body>
</html>

Обратите внимание на правила, которых следует придерживаться для приведенной выше HTML-формы:

  • Убедитесь, чтобы в форме для атрибута method было установлено значение "post"
  • Для атрибута enctype установите значение "multipart/form-data", оно позволяет загружать файлы с использованием метода POST. Кроме того, он гарантирует, что символы не кодируются при отправке формы.

Затем мы выводим поле файла, которое позволяет нам выбрать файл с компьютера:

<input type="file" name="fileToUpload" id="fileToUpload">

Форма выше отправляет данные в файл-обработчик с именем “upload.php”, который мы создадим дальше.

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

Итак, создадим файл upload.php со следующим содержимым:

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = 
strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Проверка, является ли файл изображением
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
  if($check !== false) {
    echo "Это изображение - " . $check["mime"] . ".";
    $uploadOk = 1;
  } else {
    echo "Файл не является изображением";
    $uploadOk = 0;
  }
}
?>

Рассмотрим объявленные переменные в сценарии PHP:

  • $target_dir = "uploads/" — директория, в которую будет помещен загружаемый файл.
  • $target_file — путь к загружаемому файлу
  • $uploadOk = 1 — флаг, назначение которого будет объяснено ниже
  • $imageFileType — расширения загружаемых файлов (в нижнем регистре)

Функция pathinfo() возвращает ассоциированный массив, содержащий информацию об имени, расширении и директории файла. Первым параметром мы передали $target_file (путь к загружаемому файлу), а вторым — PATHINFO_EXTENSION (расширение файла). С помощью функции strtolower() все буквенные символы расширеня переводим в нижний регистр.

При отправке файла на сервер он сначала загружается во временное место $_FILES["fileToUpload"]["tmp_name"], из которого затем с помощью функции move_uploaded_file() он перемещается в каталог сервера.

Является ли временный файл $_FILES["fileToUpload"]["tmp_name"] изображением проверим с помощью функции getimagesize(), которая определит размер любого заданного, поддерживаемого изображения и вернет этот размер вместе с типом файла и текстовой строкой height/width, которую можно будет использовать внутри тега HTML <img>, а также вернет соответствующий тип содержимого HTTP.

Примечание: Файлы будут загружены в каталог “uploads/”, поэтому вам нужно создать его в каталоге, в котором находится файл «upload.php».

Проверка существования файла

Прежде, чем двигаться дальше, выполним проверку — существует ли уже файл в папке uploads. Если это так, то выводим сообщение об ошибке, а для переменной $uploadOk установим значение 0:

// Проверка существования файла
if (file_exists($target_file)) {
  echo "Извините, файл уже существует";
  $uploadOk = 0;
}

Ограничение типа файла

Приведем код, который позволяет пользователям загружать только файлы с расширением JPGJPEGPNG и GIF. Все остальные типы файлов будут выдавать сообщение об ошибке, переменной $uploadOk установим значение 0:

// Разрешить определенные форматы файлов
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "К загрузке разрешены только файлы JPG, JPEG, PNG и GIF";
$uploadOk = 0;
}

Завершение загрузки

// Проверка, не установлено ли для $uploadOk значение 0 из-за ошибки
if ($uploadOk == 0) {
  echo "К сожалению, ваш файл не был загружен";
// если все в порядке, поробуем загрузить файл
} else {
  if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "Файл ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). 
" был загружен";
  } else {
    echo "К сожалению, при загрузке вашего файла произошла ошибка";
  }
}

Как отмечалось выше, при отправке файла на сервер он сначала загружается во временное место, из которого затем с помощью функции move_uploaded_file() он перемещается в созданный нами каталог сервера (мы прописали его в файле php.ini).

Функция move_uploaded_file() принимает два параметра — путь к загруженному временному файлу и путь, куда надо поместить загруженный файл.

Функция move_uploaded_file() возвращает TRUE в случае успеха и будет выведено сообщение: “Файл имя_файла был загружен”. Если $_FILES["fileToUpload"]["tmp_name"] не является загруженным файлом, никаких действий не предпринимается и функция возвращает FALSE, а наш код выведет сообщение: “К сожалению, при загрузке вашего файла произошла ошибка”.

Мы также используем функцию htmlspecialchars() для кодирования всех специальных символов HTML в отправленном нам файле.

Заключение

Если вам нужно гарантированно создать уникальное имя для сохранённого файла, и вы записываете его имя в БД, то не нужно ничего придумывать с рандомом или хешами. Вместо этого составьте суфикс имени как имя_таблицы+_имя_колонки+_id_записи. Имя колонки понадобится в том случае если таблица содержит несколько полей хранящих пути к файлам. Имя таблицы можно использовать как часть пути:

/image/имя_таблицы/файл

чтобы записать id в название файла, вам придётся вначале выполнить вставку – получить id вставленной строки, после этого выполнить перемещение файла и затем обновить запись дописав название файла.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *