我只是想为 Raphael 的好答案添加一些内容。以下是如何让 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);
}
});
使用该 JavaScript 提交后,这是 PHP 的 $_FILES
数组的样子:
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的微小改变:
regexp = /^[^[\]]+/;
var fileInput = $('.putImages input[type="file"]');
var fileInputName = regexp.exec( fileInput.attr('name') );
var data = new FormData();
jQuery.each($(fileInput)[0].files, function(i, file) {
data.append(fileInputName+'['+i+']', file);
});
(2017年4月14日编辑:我从FormData()的构造函数中删除了表单元素——这修复了Safari中的此代码。)
这段代码完成了两件事。
- 自动检索输入名称属性,使HTML更易维护。现在只要表单具有putImages类,其他所有东西都会自动处理。也就是说,
input
不需要有任何特殊的名称。
- JavaScript在data.append行中通过数组格式重新创建了普通HTML提交的格式。请注意方括号。
通过这些更改,使用JavaScript提交将产生与使用简单HTML提交完全相同的$_FILES
数组。
$(':file')
来选择所有的文件输入框,这样会更简单一些。 - Shahar