那麼,如果文件上傳,$ _FILE變量總是一個數組,您可以上傳單個或多個文件。
因此,可以說有關的多個文件,典型映射爲多個文件$ _FILE變量是如..
Array
(
[file] => Array
(
[name] => Array
(
[file1] => MyFile.txt
[file2] => MyFile.jpg
),
[type] => Array
(
[file1] => text/plain
[file2] => image/jpeg
),
[tmp_name] => Array
(
[file1] => /tmp/php/php1h4j1o
[file2] => /tmp/php/php6hst32
),
[error] => Array
(
[file1] => UPLOAD_ERR_OK
[file2] => UPLOAD_ERR_OK
),
[size] => Array
(
[file1] => 123
[file2] => 98174
)
)
)
因此,多文件上傳,讓說,如果我想訪問[「tmp_name的值」]從多個文件上傳,如$temp_name = $_FILES['file']['tmp_name']
然後$temp_name
將包含一個數組,
區別在於,對於單個文件上傳,$temp_name = $_FILES['file']['tmp_name']
; $temp_name
將包含一個字符串,一個上傳的單個文件的字符串。現在
,我們實際上可以將它轉換爲數組,並使它看起來像多個上傳,再次爲單個文件,如果我寫$temp_name = (array)$_FILES['file']['tmp_name']
現在$temp_name
文件將包含一個數組,這基本上是一個字符串,但包裹在一個陣列索引爲0.
現在單個和多個文件上傳看起來都差不多嗎?
因此,基於這一點,你可以因此,現在修改代碼如..
// lets be sure that $_FILES are not empty
if(!empty($_FILES)) { // I might did this check already, if so, ignore it
// now we are going to type cast the $_FILE variable as an array
foreach((array) $_FILES['file']['tmp_name'] as $key => $tmp_name){
$file_names = (array) $_FILES['file']['name']; // just ensuring that single file name is in array format
$new_image_name = $key.$file_names[$key]; // no worries about the $key!
$file_tmp = $tmp_name[$key];
$dest=$_SERVER['DOCUMENT_ROOT']."uploads/".$new_image_name;
move_uploaded_file($file_tmp, $dest);
// and so on...
}
}
,這會爲您的兩個情況下工作,如果只有1個文件,在foreach foreach((array) $_FILES['file']['tmp_name'] as $key => $tmp_name)
(陣列)鑄造將確保$_FILES['file']['tmp_name']
將包含一個至少有1個tmp_name的數組,並且對於多次上傳,它已經是一個數組!
我也在$file_names = (array) $_FILES['file']['name'];
做過同樣的事情,以確保總是會有一個名稱數組,它至少包含1個用於單獨上傳文件的名稱。
您可以用相同的方式訪問其他值。
希望它有道理:)
所有你需要做的兩種形式是使用相同的文件名,'名= 「文件[]」'。方括號是什麼讓PHP生成數組結構。 – CBroe