Загрузка множественных файлов с HTML и PHP: HTTP POST

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для реализации множественного выбора файлов воспользуйтесь атрибутом multiple в теге <input> в HTML. Затем обработайте загруженные файлы на сервере с помощью PHP, используя глобальный массив $_FILES.

HTML:

HTML
Скопировать код
<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="files[]" id="file" multiple>
  <input type="submit" value="Загрузить файлы" name="submit">
</form>

PHP:

php
Скопировать код
if (isset($_FILES['files'])) {
    foreach ($_FILES['files']['tmp_name'] as $index => $tmpName) {
        $filename = basename($_FILES['files']['name'][$index]);
        $uploadPath = "uploads/" . $filename;
        
        // Для избежания совпадений добавляем уникальный префикс к имени файла
        if (file_exists($uploadPath)) {
            $uploadPath = "uploads/" . uniqid() . "_" . $filename;
        }
        
        if (move_uploaded_file($tmpName, $uploadPath)) {
            echo "Файл успешно загружен: " . $uploadPath . "<br>";
        } else {
            echo "Произошла ошибка при загрузке файла: " . $filename . "<br>";
        }
    }
}

Не забывайте проверять параметры upload_max_filesize и max_file_uploads в php.ini для избежания проблем с превышением допустимых размеров и количества загружаемых файлов.

Кинга Идем в IT: пошаговый план для смены профессии

Детальный разбор

HTML: выбор файлов

При загрузке множества файлов следует формировать атрибут name в форме массива:

HTML
Скопировать код
<input type="file" name="files[]" id="file" multiple>

Предотвращение совпадения имен файлов

Проверяйте, нет ли уже файла с таким же именем в вашей целевой директории. Используйте функцию file_exists(). Если обнаружено совпадение, вы можете обойти его, добавив уникальный префикс с помощью функции uniqid().

Обеспечение безопасности

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

Перенос файлов

Для надёжного переноса файлов в целевую директорию используйте функцию move_uploaded_file(). Алгоритм пересылки следует реализовать внутри цикла foreach, обрабатывая каждый файл подряд.

Информирование о процессе загрузки

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

Визуализация

Markdown
Скопировать код
HTML форма 📂:
  <input type="file" name="files[]" multiple="multiple">
Markdown
Скопировать код
👨‍💻<--- Пользователь выбирает 3 файла
php
Скопировать код
foreach ($_FILES["files"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        // Осуществляем операции с дублирующимися файлами
        $filename = $_FILES["files"]["name"][$key];
        $newFilePath = "upload/path/" . $filename;
        if (file_exists($newFilePath)) {
            $newFilePath = "upload/path/" . uniqid() . "_" . $filename;
        }

        move_uploaded_file($_FILES["files"]["tmp_name"][$key], $newFilePath);
        echo "Файл $filename был успешно загружен.<br>";
    } else {
        echo "Загрузка файла $filename не произошла.<br>";
    }
}
Markdown
Скопировать код
🎯🎯🎯 <-- 3 файла успешно доставлены в директорию "upload/path/"!

Раздел "И это ещё не всё!"

Безопасность прежде всего

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

Индикаторы загрузки

Организуйте индикаторы загрузки для улучшения взаимодействия пользователя с файлами. Это возможно сделать с помощью JavaScript или AJAX, расширяя функциональность объектов FormData.

Обработка больших файлов

Настройте параметры php.ini для более эффективной обработки крупных файлов. Увеличьте memory_limit и max_execution_time при необходимости, но также следите за журналом ошибок error_log, чтобы исключить возможные сбои PHP во время загрузки.

Полезные материалы

  1. HTML input multiple AttributeОписание использования атрибута multiple для элементов ввода файлов в HTML-формах.
  2. PHP: Загрузка нескольких файлов – Руководство — Официальная документация PHP по множественной загрузке файлов.
  3. Как загрузить файлы на сервер в PHP – Tutorial RepublicОбучающая статья по загрузке файлов на сервер с примерами.
  4. Типы MIME (IANA медиа типы) – HTTPСправочник типов MIME для тех, кто хочет более глубоко изучить тему.
  5. Использование объектов FormData – Веб API — Руководство по загрузке файлов с использованием AJAX и объектов FormData.
  6. Неограниченная загрузка файлов – Фонд OWASP — Соблюдайте правила безопасности для защиты своих веб-сайтов.
  7. Описание основных директив php.ini – Руководство — Указания по настройке параметров для улучшения загрузки больших файлов, включая директивы php.ini.