Загрузка массива файлов на сервер
Довольно редко, но все же иногда перед нами встает такая задача: есть несколько полей для загрузки файлов (input type=”file”), которые должны иметь одно и то же имя, т.е. по сути есть массив файлов, который нужно разом загрузить на сервер:
<input name="files[1]" type="file" /> <input name="files[2]" type="file" /> <input name="files[3]" type="file" />
Тут можно конечно придраться «А зачем массив файлов? Можно же их просто назвать file1, file2, file3!». В ответ на это я скажу, что иногда возникает такая ситуация, что мы просто не знаем количество элементов input type=”file”, которое есть на странице. Это возникнет в случае динамической генерации страницы, например, с помощью Smarty. Это во-первых. Во-вторых, бывает необходимо как-то сообщить php-скрипту, который принимает эти файлы, какой-то идентификатор в базе, привязанный к каждому из этих файлов. В этом случае мы и можем передать его в квадратных скобках.
У меня уже есть какой-то опыт разработки на PHP, но недавно я столкнулся с такой функцией загрузки файлов впервые за всю свою жизнь Я по привычке (как и в случае передачи массива текстовых значений типа input type=”text”) стал принимать в PHP-скрипте такой массив файлов следующим образом:
$files = $_FILES['files']; foreach ($files as $key => $file) { // здесь я рассчитывал на то, что в переменной $key окажется нужный мне идентификатор, который я передал в квадратных скобках в тэге <input> на стороне клиента }
Но не тут-то было Не было там идентификатора! Я все перепроверил и потом уже подумал, что массив файлов вообще нельзя передавать с помощью input type=”file”, если не присваивать разные имена этим элементам, но решил заглянуть в документацию PHP. И вот что я там увидел:
Загрузку нескольких файлов можно реализовать используя, например, различные значения name для тега input.
Также предусмотрена возможность автоматического получения организованной в массив информации о нескольких одновременно загружаемых файлах. Для реализации такой возможности используйте тот же синтаксис отправки массива из HTML-формы, что и для множественных полей select и checkbox.
Замечание: Поддержка загрузки нескольких файлов была добавлена в PHP 3.0.10.
Ну первый абзац я уже рассмотрел в начале этого поста как неприемлемый вариант Читаем дальше:
Например, предположим, что были загружены файлы /home/test/review.html и /home/test/xwp.out. В таком случае переменная $_FILES[‘userfile’][‘name’][0] будет установлена значением review.html, а переменная $_FILES[‘userfile’][‘name’][1] - значением xwp.out. Аналогично, переменная $_FILES[‘userfile’][‘size’][0] будет содержать размер файла review.html и так далее.
Переменные $_FILES[‘userfile’][‘name’][0], $_FILES[‘userfile’][‘tmp_name’][0], $_FILES[‘userfile’][‘size’][0] и $_FILES[‘userfile’][‘type’][0] также будут инициализированы.
Вот так-то оказывается Т.е. цикл foreach, приведенный мной выше, нужно немного переделать:
foreach ($files['tmp_name'] as $key => $tmp_name) { // $key – идентификатор файла // $tmp_name – временное имя файла на сервере // $files['name'][ $key] – имя файла с идентификатором $key // $files['size'][ $key] – размер файла с идентификатором $key // $files['type'][ $key] – тип файла с идентификатором $key }
Вот и усё Это то, что я хотел сказать сегодня тому, кто периодически читает наш блог, чтобы не напороться на эти же грабли и съэкономить свое время.
Да, и небольшой совет на будущее: не ленитесь иногда заглянуть в документацию, прежде чем задавать вопрос в каком-нибудь форуме или блоге
Думаю при первом же vsr_dump($_FILES); стнет понятно как обработать массив…
adw0rd, поправочка: var_dump()
Спасибо большое за такое разъяснение, а можно спросить, только начала изучать пхп…
// $key – идентификатор файла
// $tmp_name – временное имя файла на сервере
// $files[‘name’][ $key] – имя файла с идентификатором $key
// $files[‘size’][ $key] – размер файла с идентификатором $key
// $files[‘type’][ $key] – тип файла с идентификатором $key
Зачем эти строки вообще? Они закомментированы, да?
Спасибо большое за такое разъяснение, а можно спросить, только начала изучать пхп…
// $key – идентификатор файла
// $tmp_name – временное имя файла на сервере
// $files[‘name’][ $key] – имя файла с идентификатором $key
// $files[‘size’][ $key] – размер файла с идентификатором $key
// $files[‘type’][ $key] – тип файла с идентификатором $key
Зачем эти строки вообще? Они закомментированы, да? эо просто разъяснение?
“чтобы не напороться на эти же грабли и съэкономить свое время.”
Для этих целей немедленно удалите эту страницу. Разъяснитель, мать…