好吧,如果上传文件,$_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']; 做的事情相同,以确保始终有一个名称数组,其中至少包含一个用于单个文件上传案例的名称。
您可以以相同的方式访问其他值。
希望它有意义:)