Загрузка массива файлов на сервер

Довольно редко, но все же иногда перед нами встает такая задача: есть несколько полей для загрузки файлов (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
}

Вот и усё :) Это то, что я хотел сказать сегодня тому, кто периодически читает наш блог, чтобы не напороться на эти же грабли и съэкономить свое время.

Да, и небольшой совет на будущее: не ленитесь иногда заглянуть в документацию, прежде чем задавать вопрос в каком-нибудь форуме или блоге :)





Читайте также:



5 Ответов на “Загрузка массива файлов на сервер”

  1. Думаю при первом же vsr_dump($_FILES); стнет понятно как обработать массив…

  2. adw0rd, поправочка: var_dump()

  3. TahHdeR

    Спасибо большое за такое разъяснение, а можно спросить, только начала изучать пхп…

    // $key – идентификатор файла
    // $tmp_name – временное имя файла на сервере
    // $files[‘name’][ $key] – имя файла с идентификатором $key
    // $files[‘size’][ $key] – размер файла с идентификатором $key
    // $files[‘type’][ $key] – тип файла с идентификатором $key

    Зачем эти строки вообще? Они закомментированы, да?

  4. TahHdeR

    Спасибо большое за такое разъяснение, а можно спросить, только начала изучать пхп…

    // $key – идентификатор файла
    // $tmp_name – временное имя файла на сервере
    // $files[‘name’][ $key] – имя файла с идентификатором $key
    // $files[‘size’][ $key] – размер файла с идентификатором $key
    // $files[‘type’][ $key] – тип файла с идентификатором $key

    Зачем эти строки вообще? Они закомментированы, да? эо просто разъяснение?

  5. Игорь

    “чтобы не напороться на эти же грабли и съэкономить свое время.”

    Для этих целей немедленно удалите эту страницу. Разъяснитель, мать…


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map