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.
phpuser at gmail dot com ¶20 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 formArray( [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.<?phpfunction 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:<?phpif ($_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']; }}?>
i.g.e.o@ya (dot) ru ¶5 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:<?phpfunction 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;}?>
wizzard351 at yahoo dot com ¶11 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.
Corey Ballou ¶15 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:<?phpfixFilesArray($_FILES['array_of_files']);foreach ($_FILES['array_of_files'] as $position => $file) { var_dump($file);}?>Here's the code:<?phpfunction fixFilesArray(&$files){ $names = array( 'name' => 1, 'type' => 1, 'tmp_name' => 1, 'error' => 1, 'size' => 1); foreach ($files as $key => $part) { $key = (string) $key; if (isset($names[$key]) && is_array($part)) { foreach ($part as $position => $value) { $files[$position][$key] = $value; } unset($files[$key]); } }}?>
timspeelman at live dot nl ¶13 years ago
The cleanest way to rearrange the $_FILES<?phpfunction rearrange( $arr ){ foreach( $arr as $key => $all ){ foreach( $all as $i => $val ){ $new[$i][$key] = $val; } } return $new;}?>
lookphp at gmail dot com ¶9 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<?phpecho '<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;}
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}
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;}