Почему в $_FILE может передаваться только один, последний файлы из прикрепленных в input?

В 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 окажется только последний выбранный файл. Чтобы сохранить информацию о каждом файле, следует использовать уникальные названия полей загрузки.