Subida de varios ficheros

Se pueden subir varios ficheros utilizando diferentes name para los input.

También es posible subir varios ficheros simultáneamente y tener la información organizada automáticamente en arrays. Para ello es necesario utilizar la misma sintaxis de presentación de array en el formulario HTML, tal como se hace con 'selects' y 'checkboxes' múltiples:

Ejemplo #1 Subida de varios ficheros

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Enviar estos ficheros:<br />
  <input name="fichero_usuario[]" type="file" /><br />
  <input name="fichero_usuario[]" type="file" /><br />
  <input type="submit" value="Enviar ficheros" />
</form>

Cuando se envía el formulario de arriba, se inicializarán los arrays $_FILES['fichero_usuario'], $_FILES['fichero_usuario']['name'] y $_FILES['fichero_usuario']['size'] serán inicializados.

Por ejemplo, suponga que se envían los nombres de fichero /home/test/review.html y /home/test/xwp.out. En este caso,$_FILES['fichero_usuario']['name'][0] contendría el valor review.html, y $_FILES['fichero_usuario']['name'][1] contendría el valor xwp.out. De manera similar, $_FILES['fichero_usuario']['size'][0] contendría el tamaño del fichero review.html, y así sucesivamente.

También se establecen $_FILES['fichero_usuario']['name'][0], $_FILES['fichero_usuario']['tmp_name'][0], $_FILES['fichero_usuario']['size'][0], y $_FILES['fichero_usuario']['type'][0].

Advertencia

El ajuste de configuración max_file_uploads actúa como límite del número de ficheros que se pueden subir en una petición. Es necesario asegurarse de que el formulario no intente subir más ficheros que este límite en una petición.

add a note

User Contributed Notes 8 notes

up
353
phpuser at gmail dot com
19 years ago
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'];
}
}

?>
up
18
i.g.e.o@ya (dot) ru
4 years ago
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;
}
?>
up
50
wizzard351 at yahoo dot com
10 years ago
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.
up
1
steam dot bakyt2 at gmail dot com
1 year ago
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
}
up
12
Corey Ballou
14 years ago
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]);
}
}
}
?>
up
15
timspeelman at live dot nl
12 years ago
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;
}
?>
up
6
lookphp at gmail dot com
8 years ago
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;
}
up
0
sabryabdelmohsen at gmail dot com
4 years ago
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;
}
To Top