Множественная PHP загрузка изображений

Всем привет, в этой статье рассмотрим, как можно при помощи встроенных функций языка PHP, загружать файлы интересующего вас типа на сервер. Реализуем возможность загрузки одновременно нескольких изображений. Для этого создадим структуру HTML-формы и подготовим её для этого процесса.

Файл form.php

<form action="/upload.php" method="POST" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
  <input type="file" name="images[]" accept=".jpg, .jpeg, .png" multiple="multiple" />
  <input type="submit" name="save" value="Сохранить" />
</form>

Разберём значения атрибутов.

  • form
    • action=»/upload.php» — путь до файла обработчика отправляемых данных;
    • method=»POST» — метод отправки данных;
    • enctype=»multipart/form-data» — значение, которое применяется для загрузки файлов и указывает, что отправляемые данные на сервер будут передаваться в незакодированном виде.
  • input hidden
    • name=»MAX_FILE_SIZE» — имя, которое определяет текущее поле со значением константы указывающей, что это поле задаёт максимальный размер загружаемых файлов;
    • value=»2000000″ — значение максимального размера загружаемых файлов в байтах.
  • input file
    • accept=».jpg, .jpeg, .png» — тип загружаемых файлов;
    • multiple=»multiple» — разрешает выбор нескольких файлов.

Несмотря на то, что полю формы для выбора файлов задан атрибут с необходимыми типами изображений, следует всегда выполнять проверку загружаемых файлов со стороны сервера, для того чтобы уменьшить уязвимость скрипта. Это связано с возможностью подмены исходного кода в инспекторе объектов, и таким образом любому посетителю ничего не мешает изменить значение этого атрибута на свои типы файлов и взломать ваш сайт. В свою очередь указание этого атрибута предназначено для показа файлов, имеющих требуемый тип, при выборе загружаемых файлов через HTML-форму.

Теперь пришло время серверной части. Создадим переменные с кодами ошибок возникающих при загрузке и необходимыми типами.

Файл upload.php:

$mime_types = array(
    'image/jpeg' => 'jpeg',
    'image/jpg'  => 'jpg',
    'image/png'  => 'png'
);
 
$message_list = array();

Скрипт загрузки выглядит следующим образом.

Файл upload.php:

if(isset($_POST['save'])) {
    $upload = $_SERVER['DOCUMENT_ROOT'] . '/upload';
 
    $files = $_FILES['images'];
    foreach($files['error'] as $key => $error) {
        if($error == 0 && array_key_exists($files['mime'][$key])) {
            move_uploaded_file($files['tmp_name'][$key], $upload . '/' . $files['name'][$key]);
            $message_list[] = 'файл <em>' . $files['name'][$key] . '</em> успешно загружен';
        } else {
            $message_list[] = 'файл <em>' . $files['name'][$key] . '</em> не может быть загружен';
        }
    }
 
    echo '<p>' . implode('</p><p>', $message_list) . '</p>';
 
    unset($files, $upload, $key, $error);
}

Что делает данный код. В цикле перебираются все загружаемые через HTML-форму файлы. Каждый файл проверяется на наличие ошибок. Если таковых не имеется, что говорит нам значение 0 в условии, и тип файла соответствует изображению, то мы применяем функцию move_uploaded_file для перемещения временного файла в загружаемую директорию.

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

Коды самих ошибок с их пояснением представлены ниже.

0 - файл успешно загружен;
1 - загружаемый файл превышает максимально допустимый размер указанный в настройках сервера;
2 - загружаемый файл превышает максимально допустимый размер указанный в HTML-форме;
3 - файл был загружен только частично;
4 - не выбрано ни одного файла;
6 - произошёл сбой из-за отсутствия папки для хранения временных файлов;
7 - не удалось записать файл на диск;
8 - расширением PHP была остановлена загрузка файлов.
Понравилась статья? Поделись: