Добавьте []
к имени поля ввода, например:
<input type="file" name="uploaded[]" multiple="" />
Каждый файл использует одно и то же имя «загружен», поэтому «загруженный» заменяется каждым последующим обрабатываемым файлом. Добавляя квадратные скобки, каждый последующий файл добавляется в «загруженный» массив. Вот массив $_FILES
, который я получаю после добавления []
:
Array
(
[uploaded] => Array
(
[name] => Array
(
[0] => file4.txt
[1] => file1.txt
[2] => file2.txt
[3] => file3.txt
)
[type] => Array
(
[0] => text/plain
[1] => text/plain
[2] => text/plain
[3] => text/plain
)
[tmp_name] => Array
(
[0] => C:\temp\php95.tmp
[1] => C:\temp\php96.tmp
[2] => C:\temp\php97.tmp
[3] => C:\temp\php98.tmp
)
[error] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 0
)
[size] => Array
(
[0] => 7
[1] => 2850
[2] => 27
[3] => 231
)
)
)
Индекс 0
в каждом массиве - это один файл, индекс 1
, в каждом массиве - следующий файл и т. Д.
Это также, как вы получите значения нескольких флажков с тем же именем. (См. этот комментарий для примера.
Вот как можно перебирать загруженные файлы.
// first get the count of how many files are uploaded
$numFiles = count(array_filter($_FILES['uploaded']['name']));
for ($i = 0; $i < $numFiles; ++$i) {
$target_path = 'c:/temp/' . basename($_FILES['uploaded']['name'][$i]);
if(move_uploaded_file($_FILES['uploaded']['tmp_name'][$i], $target_path)) {
echo "the file ".basename($_FILES['uploaded']['name'][$i])." has been uploaded<br />";
}
}
Обратите внимание, как я использую $i
в цикле for
, чтобы отслеживать индекс текущего файла.
(Если вам интересно, почему я позвонил array_filter()
, чтобы получить счет, похоже, что пустая запись автоматически существует, если вы не загружаете какие-либо файлы. array_filter()
удаляет эту пустую / недействительную запись.)