只是想为拉斐尔的精彩回答添加一点内容。以下是如何让 PHP 生成相同$_FILES
的,无论您是否使用 JavaScript 提交。
HTML 表单:
<form enctype="multipart/form-data" action="/test.php"
method="post" class="putImages">
<input name="media[]" type="file" multiple/>
<input class="button" type="submit" alt="Upload" value="Upload" />
</form>
PHP$_FILES
在没有 JavaScript 的情况下生成 this :
Array
(
[media] => Array
(
[name] => Array
(
[0] => Galata_Tower.jpg
[1] => 518f.jpg
)
[type] => Array
(
[0] => image/jpeg
[1] => image/jpeg
)
[tmp_name] => Array
(
[0] => /tmp/phpIQaOYo
[1] => /tmp/phpJQaOYo
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 258004
[1] => 127884
)
)
)
如果你做渐进式增强,使用拉斐尔的 JS 提交文件...
var data = new FormData($('input[name^="media"]'));
jQuery.each($('input[name^="media"]')[0].files, function(i, file) {
data.append(i, file);
});
$.ajax({
type: ppiFormMethod,
data: data,
url: ppiFormActionURL,
cache: false,
contentType: false,
processData: false,
success: function(data){
alert(data);
}
});
...这就是 PHP 的$_FILES
数组的样子,在使用该 JavaScript 提交之后:
Array
(
[0] => Array
(
[name] => Galata_Tower.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpAQaOYo
[error] => 0
[size] => 258004
)
[1] => Array
(
[name] => 518f.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpBQaOYo
[error] => 0
[size] => 127884
)
)
这是一个不错的数组,实际上是某些人转换$_FILES
成的数组,但我发现使用相同的数组很有用$_FILES
,无论是否使用 JavaScript 提交。所以,这里对 JS 做一些小的改动:
// match anything not a [ or ]
regexp = /^[^[\]]+/;
var fileInput = $('.putImages input[type="file"]');
var fileInputName = regexp.exec( fileInput.attr('name') );
// make files available
var data = new FormData();
jQuery.each($(fileInput)[0].files, function(i, file) {
data.append(fileInputName+'['+i+']', file);
});
(2017 年 4 月 14 日编辑:我从 FormData() 的构造函数中删除了表单元素——这在 Safari 中修复了此代码。)
该代码做了两件事。
- 自动检索
input
名称属性,使 HTML 更易于维护。现在,只要form
有 putImages 类,其他一切都会自动处理。也就是说,input
不需要有任何特殊的名称。
- 普通 HTML 提交的数组格式由 data.append 行中的 JavaScript 重新创建。注意括号。
$_FILES
通过这些更改,使用 JavaScript 提交现在生成与使用简单 HTML 提交完全相同的数组。