Php 上载文件-->;阵列/单个文件
我已经准备好了表单,它们都将文件发送到“upload.php”。 “Upload.php”将上载的文件移动到目标目录并生成缩略图Php 上载文件-->;阵列/单个文件,php,file,upload,Php,File,Upload,我已经准备好了表单,它们都将文件发送到“upload.php”。 “Upload.php”将上载的文件移动到目标目录并生成缩略图 问题:一个表单只发送一个文件,所以在这个表单中 case upload.php没有获得$\u FILES-array。(输入type=“file”name=“file”>)。此表单是从移动设备发送的,我不知道如何将文件对象更改为数组,因此无法更改此表单 另一个表单发送一个包含一个或多个文件的文件数组(input type=“file”name=“file[]”>)
- 问题:一个表单只发送一个文件,所以在这个表单中 case upload.php没有获得$\u FILES-array。(输入type=“file”name=“file”>)。此表单是从移动设备发送的,我不知道如何将文件对象更改为数组,因此无法更改此表单
- 另一个表单发送一个包含一个或多个文件的文件数组(input type=“file”name=“file[]”>)
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将始终获得一个数组。如果上载了文件,$\u FILE变量始终是一个数组,您可以上载单个或多个文件 假设有多个文件,多个文件的$\u 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\u name',比如,$temp\u name=$\u文件['file']['tmp\u name']
,那么$temp\u name
将包含一个数组
不同之处在于,对于单个文件上载,$temp\u name=$\u FILES['file']['tmp\u name']
;$temp\u name
将包含一个字符串,即上载单个文件的一个字符串
现在,我们可以将其强制转换为数组,并使其看起来像是多个上载,同样对于单个文件,如果我编写$temp\u name=(数组)$\u FILES['file']['tmp\u name']
现在$temp\u 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...
}
}
现在,这将适用于两种情况,如果foreachforeach((数组)$\u FILES['file']['tmp\u name']as$key=>$tmp\u name)
中只有1个文件,(数组)强制转换,将确保$\u FILES['file']['tmp\u name']
将包含一个至少有1个tmp\u名称的数组,并且对于多次上载,它已经是一个数组了
我在$file\u names=(array)$\u FILES['file']['name'];
上做了同样的事情,以确保始终存在一个名称数组,其中至少包含一个文件上传案例的名称
您可以以相同的方式访问其他值
希望它有意义:)看起来不错。对于一个文件上载,您的html必须如下所示:
<form action="" method="post" enctype="multipart/form-data" >
<input type="file" name="file[]">
<button name="submit" type="submit" class="btn btn-default save_change_btn">upload photo</button>
</form>
上传照片
这是2个文件的上传:
<form action="" method="post" enctype="multipart/form-data" >
<input type="file" name="file[]">
<input type="file" name="file[]">
<button name="submit" type="submit" class="btn btn-default save_change_btn">upload photo</button>
</form>
上传照片
您只需在两种表单中使用相同的文件名,name=“file[]”
。方括号使PHP生成数组结构。