Caricamento di più file
È possibile inviare più file contemporanemante utilizzando differenti
attributi name
i per input
.
E' possibile caricare più file contemporaneamente e avere
le informazioni organizzate automaticamente in array. Per questo
è necessario utilizzare la medesima sintassi di invio di array da form HTML che
è utilizzata con select e checkbox multipli:
Example #1 Caricamento di più file
<form action="file-upload.php" method="post" enctype="multipart/form-data">
Send these files:<br />
<input name="userfile[]" type="file" /><br />
<input name="userfile[]" type="file" /><br />
<input type="submit" value="Send files" />
</form>
Quando la form è inviata, gli array
$_FILES['userfile'],
$_FILES['userfile']['name'], e
$_FILES['userfile']['size'] saranno
inizializzati.
Per esempio, si supponga che i nomi di file
/home/test/review.html e
/home/test/xwp.out siano inviati. In questo
caso, $_FILES['userfile']['name'][0] conterrebbe
il valore review.html, e
$_FILES['userfile']['name'][1] conterrebbe
il valore xwp.out. Analogamente,
$_FILES['userfile']['size'][0] conterrebbe la dimensione di
review.html, e così via.
$_FILES['userfile']['name'][0],
$_FILES['userfile']['tmp_name'][0],
$_FILES['userfile']['size'][0], e
$_FILES['userfile']['type'][0] sono ugualmente
impostati.
Avviso
Da PHP 5.2.12, il parametro di configurazione
max_file_uploads
limita il numero di file che possono essere
caricati durante una richiesta. Occorre assicurarsi che il form non
cerchi di caricare più file di questo limite.
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;}