我已经找到了将文件发送到" upload.php"的表单。 " upload.php的"将上传的文件移动到目标目录并生成缩略图。
在我的upload.php中,我使用foreach遍历文件数组:
foreach($_FILES['file']['tmp_name'] as $key => $tmp_name ){
$new_image_name = $key.$_FILES['file']['name'][$key];
$file_tmp =$_FILES['file']['tmp_name'][$key];
$dest=$_SERVER['DOCUMENT_ROOT']."uploads/".$new_image_name;
move_uploaded_file($file_tmp, $dest);
// and so on...
}
使用发送文件数组的表单,它可以完美运行。 但是你可以想象只发送一个文件的表单并没有通过foreach。
那么最好的解决方案是让upload.php适用于这两种形式吗? 我的想法:upload.php首先要检查,如果$ Files是一个数组,如果没有将它转换为数组。然后foreach将始终获得一个数组
答案 0 :(得分:1)
好吧,如果上传文件,$ _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...
}
}
现在,这将适用于您的两种情况,如果在foreach foreach( (array) $_FILES['file']['tmp_name'] as $key => $tmp_name )
中只有1个文件,(数组)强制转换将确保$_FILES['file']['tmp_name']
将包含至少1个tmp_name的数组,对于多次上传,它已经是一个数组!
我在$file_names = (array) $_FILES['file']['name'];
做了同样的事情,以确保总会有一个名称数组,至少包含一个名称用于单个文件上传案例。
您可以以相同的方式访问其他值。
希望有意义:))