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

Загрузку нескольких файлов можно реализовать используя, например, различные значения name для тега input.

Также можно одновременно загружать несколько файлов и автоматически получить их в виде массива. Для реализации такой возможности используйте тот же синтаксис отправки массива из HTML-формы, что и для множественных полей select и checkbox:

Пример #1 Загрузка нескольких файлов

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Файлы:<br />
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input type="submit" value="Отправить" />
</form>

В случае, если такая форма была отправлена, массивы $_FILES['userfile'], $_FILES['userfile']['name'], и $_FILES['userfile']['size'] будут инициализированы (точно так же, как и $HTTP_POST_FILES для PHP 4.1.0 и более ранних версий). Если включена конфигурационная директива register_globals, также будут инициализированы сопутствующие глобальные переменные. Каждая из таких переменных будет представлять собой численно индексированный массив соответствующих значений для принятых файлов.

Например, предположим, что были загружены файлы /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] также будут инициализированы.

Внимание

Начиная с версии PHP 5.2.12, конфигурационная директива max_file_uploads регулирует лимит одновременно загружаемых файлов в течение одного запроса. Вам необходимо будет убедиться, что ваша форма не пытается загрузить файлов больше этого лимита за один запрос.

Коментарии

When uploading multiple files, the $_FILES variable is created in the form:

Array
(
    [name] => Array
        (
            [0] => foo.txt
            [1] => bar.txt
        )

    [type] => Array
        (
            [0] => text/plain
            [1] => text/plain
        )

    [tmp_name] => Array
        (
            [0] => /tmp/phpYzdqkD
            [1] => /tmp/phpeEwEWG
        )

    [error] => Array
        (
            [0] => 0
            [1] => 0
        )

    [size] => Array
        (
            [0] => 123
            [1] => 456
        )
)

I found it made for a little cleaner code if I had the uploaded files array in the form

Array
(
    [0] => Array
        (
            [name] => foo.txt
            [type] => text/plain
            [tmp_name] => /tmp/phpYzdqkD
            [error] => 0
            [size] => 123
        )

    [1] => Array
        (
            [name] => bar.txt
            [type] => text/plain
            [tmp_name] => /tmp/phpeEwEWG
            [error] => 0
            [size] => 456
        )
)

I wrote a quick function that would convert the $_FILES array to the cleaner (IMHO) array.

<?php

function reArrayFiles(&$file_post) {

   
$file_ary = array();
   
$file_count count($file_post['name']);
   
$file_keys array_keys($file_post);

    for (
$i=0$i<$file_count$i++) {
        foreach (
$file_keys as $key) {
           
$file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return 
$file_ary;
}

?>

Now I can do the following:

<?php

if ($_FILES['upload']) {
   
$file_ary reArrayFiles($_FILES['ufile']);

    foreach (
$file_ary as $file) {
        print 
'File Name: ' $file['name'];
        print 
'File Type: ' $file['type'];
        print 
'File Size: ' $file['size'];
    }
}

?>
2005-05-26 11:09:40
http://php5.kiev.ua/manual/ru/features.file-upload.multiple.html
Автор:
Here is a function to fix the indices of a multi-dimensional for easier parsing when dealing with file uploads.  It takes a single $_FILES field array as a parameter and separates each individual uploaded file by numeric key.  This allows for iterating like:

<?php
fixFilesArray
($_FILES['array_of_files']);
foreach (
$_FILES['array_of_files'] as $position => $file) {
   
// should output array with indices name, type, tmp_name, error, size
   
var_dump($file);
}
?>

Here's the code:

<?php
/**
 * Fixes the odd indexing of multiple file uploads from the format:
 *
 * $_FILES['field']['key']['index']
 *
 * To the more standard and appropriate:
 *
 * $_FILES['field']['index']['key']
 *
 * @param array $files
 * @author Corey Ballou
 * @link http://www.jqueryin.com
 */
function fixFilesArray(&$files)
{
   
$names = array( 'name' => 1'type' => 1'tmp_name' => 1'error' => 1'size' => 1);

    foreach (
$files as $key => $part) {
       
// only deal with valid keys and multiple files
       
$key = (string) $key;
        if (isset(
$names[$key]) && is_array($part)) {
            foreach (
$part as $position => $value) {
               
$files[$position][$key] = $value;
            }
           
// remove old key reference
           
unset($files[$key]);
        }
    }
}
?>
2010-03-25 15:10:39
http://php5.kiev.ua/manual/ru/features.file-upload.multiple.html
The cleanest way to rearrange the $_FILES

<?php
function rearrange$arr ){
    foreach( 
$arr as $key => $all ){
        foreach( 
$all as $i => $val ){
           
$new[$i][$key] = $val;   
        }   
    }
    return 
$new;
}
?>
2011-11-18 17:48:16
http://php5.kiev.ua/manual/ru/features.file-upload.multiple.html
This is also needed for <input type=file multiple> elements.

So, if you have an input element like this:
<input type="file" multiple="multiple" name="foobar" />
This should be written as
<input type="file" multiple="multiple" name="foobar[]" />
else you'll only be able to get one of the files.
2014-01-27 20:12:08
http://php5.kiev.ua/manual/ru/features.file-upload.multiple.html
This is a very simple example:

Part I : HTML

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="upload.php" method="post" multipart="" enctype="multipart/form-data">
        <input type="file" name="img[]" multiple>
        <input type="submit">
    </form>
</body>
</html>

Part II : PHP

<?php
echo '<pre>';
$img $_FILES['img'];

if(!empty(
$img))
{
   
$img_desc reArrayFiles($img);
   
print_r($img_desc);
   
    foreach(
$img_desc as $val)
    {
       
$newname date('YmdHis',time()).mt_rand().'.jpg';
       
move_uploaded_file($val['tmp_name'],'./uploads/'.$newname);
    }
}

function 
reArrayFiles($file)
{
   
$file_ary = array();
   
$file_count count($file['name']);
   
$file_key array_keys($file);
   
    for(
$i=0;$i<$file_count;$i++)
    {
        foreach(
$file_key as $val)
        {
           
$file_ary[$i][$val] = $file[$val][$i];
        }
    }
    return 
$file_ary;
}
2016-04-10 08:50:14
http://php5.kiev.ua/manual/ru/features.file-upload.multiple.html
A bit update to 14 year ago note from "phpuser at gmail dot com".
That update converts to a really more friendly array form incoming _POST info for uploaded files. 
And that variants works identical for non-multiple uploads and multiple uploads:
<?php
//Функция переформатирует массив поданных POST'ом файлов
function reArrayFiles(&$file_post){
   
$isMulti    is_array($file_post['name']);
   
$file_count    $isMulti?count($file_post['name']):1;
   
$file_keys    array_keys($file_post);

   
$file_ary    = [];    //Итоговый массив
   
for($i=0$i<$file_count$i++)
        foreach(
$file_keys as $key)
            if(
$isMulti)
               
$file_ary[$i][$key] = $file_post[$key][$i];
            else
               
$file_ary[$i][$key]    = $file_post[$key];

    return 
$file_ary;
}
?>
2020-05-22 20:10:45
http://php5.kiev.ua/manual/ru/features.file-upload.multiple.html
function reArrayImages($file_post) {
    $file_ary = [];
    $file_keys = array_keys($file_post);
    foreach ($file_post as $key => $value) {
      foreach ($value as $key2 => $value2) {
        $file_ary[$key2][$key] = $value2;
      }
    }
    return $file_ary;
}
2020-09-08 08:48:08
http://php5.kiev.ua/manual/ru/features.file-upload.multiple.html
Just combine temporary path with the filename which will result an array like:

array(2) {
  ["/tmp/phpAYCvcc"]=> string(10) "file1.jpg"
  ["/tmp/phpCDg79o"]=> string(10) "file2.jpg"
}

The code:

$files = array_combine(
     $_FILES['receipt']['tmp_name'], 
     $_FILES['receipt']['name']
);

foreach ($files as $key => $value) {
    // save your files locally
}
2023-11-07 10:29:05
http://php5.kiev.ua/manual/ru/features.file-upload.multiple.html

    Поддержать сайт на родительском проекте КГБ