Çoklu dosya yükleme
input
lar için farklı name
değerleri
kullanarak çoklu dosya gönderilebilir.
Ayrıca bilgilerin otomatik olarak dizilerde düzenlendiği bir eşzamanlı
dosya gönderimi de mümkündür. Bunun için, HTML formunda birden fazla input
için aynı dizi söz dizimini kullanmalısınız:
Örnek 1 - Çoklu dosya yükleme
<form action="dosya-yukle.php" method="post" enctype="multipart/form-data">
Bu dosyaları gönder:<br />
<input name="kullanici_dosyasi[]" type="file" /><br />
<input name="kullanici_dosyasi[]" type="file" /><br />
<input type="submit" value="Dosyaları gönder" />
</form>
Yukarıdaki form gönderildiğinde,
$_FILES['kullanici_dosyasi'],
$_FILES['kullanici_dosyasi']['name'] ve
$_FILES['kullanici_dosyasi']['size'] dizileri
ilklendirilir.
Örneğin, gönderilen dosya isimleri
/home/test/review.html ve
/home/test/xwp.out olsun. Bu durumda,
$_FILES['kullanici_dosyasi']['name'][0]
review.html değerini içerir ve
$_FILES['kullanici_dosyasi']['name'][1]
xwp.out değerini içerir.
Benzer şekilde,
$_FILES['kullanici_dosyasi']['size'][0]
review.html'in dosya boyutunu içerir ve böyle devam
eder.
$_FILES['kullanici_dosyasi']['name'][0],
$_FILES['kullanici_dosyasi']['tmp_name'][0],
$_FILES['kullanici_dosyasi']['size'][0] ve
$_FILES['kullanici_dosyasi']['type'][0]'a da ayrıca
değerleri atanır.
Uyarı
max_file_uploads yapılandırma
seçeneği bir istekte yüklenebilecek azami dosya sayısını belirtmek için
kullanılabilmektedir. Formunuzun bir istekte bu sayıdan fazla dosya
yüklemeye çalışmamasını sağlamalısınız.
Örnek 2 - Dizinin tamamen karşıya yüklenmesi
HTML dosya karşıya yükleme alanlarında,
webkitdirectory
özniteliği ile bir dizinin tamamı
karşıya yüklenebilir. Bu özellik günümüz tarayıcılarının çoğu
tarafından desteklenmektedir.
full_path
bilgisi ile göreli dosya yolunu
saklamak ve sunucuda aynı dizini oluşturmak mümkündür.
<form action="file-upload.php" method="post" enctype="multipart/form-data">
Bu dizini gönder:<br />
<input name="userfile[]" type="file" webkitdirectory multiple />
<input type="submit" value="Dosyaları gönder" />
</form>
Uyarı
webkitdirectory
özniteliği standart değildir ve
standartlaşma sürecinde değildir. İnternete açık üretim sitelerinde
kullanılmamalıdır: her kullanıcı için çalışmayacaktır. Ayrıca
uygulamalar arasında büyük uyumsuzluklar olabilir ve davranış gelecekte
değişebilir.
PHP sadece tarayıcının gönderdiği göreli dizin yapısını çözümler ve bu
bilgiyi $_FILES dizisinde aktarır.
full_path
dizisindeki değerlerin gerçek dizin
yapısını içermesinin bir garantisi yoktur ve PHP uygulamalarında bu
bilgiye güvenilmemelidir.
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;}