Спасибо за обновленный пост.
Если в одной форме происходит несколько загрузок файлов , которые имеют имя элемента в формате массива , $_FILES
становится все шатким. Вместо добавления другого слоя между именем элемента формы и информацией о файле, он добавляет еще один слой после информации о файле .
Может быть, лучше визуализировать это:
array(
'name' => array(
0 => 'foo.gif',
1 => 'bar.jpeg'
),
'tmp_name' => array(
0 => '/tmp/something',
1 => '/tmp/else',
)
);
Не то, что вы ожидали, верно?
Теперь ваш код делает что-то совершенно бессмысленное. Вы перебираете $_POST
, но затем обрабатываете $_FILES
. Вещи не работают таким образом.
У меня нет понятия , где вы получаете исходный массив, который вы разместили, поэтому я его проигнорирую.
Давайте представим, что 'file'
- это имя элемента формы многофайловой загрузки, а полностью перестроит массив $_FILES
:
$fixed_files = array();
foreach($_FILES['file'] as $expected => $unexpected) {
foreach($unexpected as $index => $data)
$fixed_files[$index][$expected] = $data;
}
(Этот код может завершиться ошибкой, если внутреннее значение не является массивом - см. Страницу многократной загрузки в руководстве по PHP , чтобы узнать о других вариантах исправления $_FILES
.)
Там. Теперь мы можем перебрать $fixed_files
, как мы могли бы с самого начала:
foreach($fixed_files as $uploaded) {
$safe_name = preg_replace('/[^A-Za-z0-9_-\.]/', '', $uploaded["name"]);
move_uploaded_file($uploaded["tmp_name"], "upload/" . $safe_name);
$links[] = "upload/" . $safe_name;
}
Обратите внимание на новое дополнение к вашему предыдущему коду - $safe_name
. Элемент name массива исходит от пользователя и ему нельзя доверять. Регулярное выражение удаляет все, кроме букв, цифр, тире, подчеркиваний и точек.
Вам также следует больше проверять загруженные данные, если можете! Например, если вы ожидаете изображения, вы должны попытаться проверить, действительно ли файлы являются изображениями. Если вы используете PHP 5.3, проверьте finfo_file
. Вы можете использовать его, чтобы получить MIME-тип файла и убедиться, что вы можете работать с ним.