В PHP переменная $_FILES используется для хранения информации о загруженных файлов через HTTP-запросы, отправленные на сервер. По умолчанию, когда в форме имеется поле загрузки файлов типа "file" с атрибутом "multiple" (разрешено выбирать несколько файлов), в массив $_FILES записывается информация о каждом выбранном файле. Однако, при доступе к этим файлам через $_FILES, возникает ощущение, что передается только один, последний файл из списка.
Чтобы понять, почему это происходит, необходимо принять во внимание то, как PHP обрабатывает файлы, переданные в форме.
При отправке файлов на сервер, они временно сохраняются во временной директории на сервере. После этого, PHP генерирует массив $_FILES, содержащий информацию о каждом выбранном файле, а именно:
- $_FILES['name'] - оригинальное имя файла на компьютере пользователя
- $_FILES['type'] - MIME-тип файла
- $_FILES['tmp_name'] - временное имя файла на сервере
- $_FILES['error'] - код ошибки, если такая возникла
- $_FILES['size'] - размер файла в байтах
Массив $_FILES генерируется на основе названий полей загрузки файлов в форме. Если поле имеет атрибут "multiple", то в массиве $_FILES эта информация строится в виде многомерного массива, где каждый файл представлен в виде отдельного подмассива с соответствующими ключами.
Однако возникает проблема, если у файлов, выбранных в форме, совпадают названия полей загрузки. В этом случае, при обработке файлов PHP перезаписывает информацию о файлах в один и тот же ключ массива $_FILES, сохраняя только последнее значение, поскольку ключи массива не могут повторяться.
Для решения этой проблемы, можно добавить номер или другую уникальную информацию к названию каждого поля загрузки в форме, чтобы избежать конфликта и сохранить информацию о каждом файле в массиве $_FILES.
Вот пример, как можно модифицировать форму, чтобы работать с несколькими загружаемыми файлами:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file1"> <input type="file" name="file2"> <input type="file" name="file3"> <input type="submit" value="Upload"> </form>
При обработке этой формы на стороне сервера, массив $_FILES будет содержать информацию о каждом отдельном файле, доступную через их названия:
$file1 = $_FILES['file1']; $file2 = $_FILES['file2']; $file3 = $_FILES['file3'];
Теперь в каждой переменной будет информация о соответствующем файле, и вы сможете обрабатывать их по отдельности.
В заключение, при работе с загружаемыми файлами через $_FILES в PHP, важно учитывать, что если названия полей загрузки совпадают, то информация о файлах будет перезаписываться, и в массиве $_FILES окажется только последний выбранный файл. Чтобы сохранить информацию о каждом файле, следует использовать уникальные названия полей загрузки.