Создание формы загрузки
Сделаем 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
. Если это так, то выводим сообщение об ошибке, а для переменной $uploadOk
установим значение 0
:
// Проверка существования файла
if (file_exists($target_file)) {
echo "Извините, файл уже существует";
$uploadOk = 0;
}
Ограничение типа файла
Приведем код, который позволяет пользователям загружать только файлы с расширением JPG
, JPEG
, PNG
и 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 вставленной строки, после этого выполнить перемещение файла и затем обновить запись дописав название файла.