只是想给拉斐尔的回答补充一点。下面是如何让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>
在没有JavaScript的情况下,PHP会生成这个$_FILES:
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
)
)
)
如果你做渐进式增强,使用Raphael的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()的构造函数中删除了form元素——在Safari中修复了这段代码。)
该代码做两件事。
自动检索输入名称属性,使HTML更易于维护。现在,只要表单有putImages类,其他一切都会自动处理。也就是说,输入不需要有任何特殊的名称。
普通HTML提交的数组格式由JavaScript在数据中重新创建。附加线。注意括号。
通过这些更改,使用JavaScript提交现在生成的$_FILES数组与使用简单HTML提交的数组完全相同。