我正在使用上传脚本。我唯一需要编辑的就是$ _FILES数组的格式。
我的HTML
<input id="upload_dialog" name="file[]" type="file" multiple>
我的Javascript
<script>
$('#upload_dialog').on('change', function(event) {
var form = new FormData();
$.each(event.target.files, function(key, value) {
form.append(key, value);
});
$.ajax({
url: 'url,
type: 'POST',
data: form,
processData: false,
contentType: false,
cache: false,
async: true,
done: function(data) {
data = JSON.parse(data);
});
});
</script>
我将通过ajax上传文件来获得此数组。
array(2) {
[0]=>
array(5) {
["name"]=>
string(11) "ps-logo.jpg"
["type"]=>
string(10) "image/jpeg"
["tmp_name"]=>
string(23) "/home/www/tmp/phpMBu4TE"
["error"]=>
int(0)
["size"]=>
int(24722)
}
[1]=>
array(5) {
["name"]=>
string(12) "tnk-logo.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(23) "/home/www/tmp/php9yPGpf"
["error"]=>
int(0)
["size"]=>
int(23748)
}
}
但是我需要这种类型的数组,如果我仅通过纯PHP提交上传表单,通常会得到这种数组。
array(1) {
["file"]=>
array(5) {
["name"]=>
array(2) {
[0]=>
string(12) "tnk-logo.png"
[1]=>
string(11) "ps-logo.jpg"
}
["type"]=>
array(2) {
[0]=>
string(9) "image/png"
[1]=>
string(10) "image/jpeg"
}
["tmp_name"]=>
array(2) {
[0]=>
string(23) "/home/www/tmp/phpWGezym"
[1]=>
string(23) "/home/www/tmp/phpIqOpKY"
}
["error"]=>
array(2) {
[0]=>
int(0)
[1]=>
int(0)
}
["size"]=>
array(2) {
[0]=>
int(23748)
[1]=>
int(24722)
}
}
}
有没有一种简单的方法可以通过ajax发送数据以获得这种类型的数组?
答案 0 :(得分:0)
JavaScript解决方案
不是将文件添加为新表单的元素,而是使用输入已位于其中的表单创建FormData
实例。
$('#upload_dialog').on('change', function(event) {
var input = event.target,
form = input.form,
data = new FormData(form);
$.ajax({
url: '/form.php',
type: 'POST',
data: data,
processData: false,
contentType: false,
cache: false,
async: true,
done: function(data) {
data = JSON.parse(data);
}
});
});
我原来不太好的PHP解决方案
要让PHP处理提交文件的两种方式,您可以执行以下操作将其转换为所需的格式(如果尚未采用该格式):
function maybe_ajax_files($field) {
// If $_FILES is empty or it's already got the field we need,
// just use it as-is.
if (empty($_FILES) || isset($_FILES[$field])) {
return $_FILES;
}
// Otherwise, regroup them...
$regrouped = array();
foreach ($_FILES as $file) {
foreach ($file as $key => $val) {
if (!isset($regrouped[$key])) {
$regrouped[$key] = array();
}
$regrouped[$key][] = $val;
}
}
// Then assign that array to the desired field in a new array.
$files = array();
$files[$field] = $regrouped;
return $files;
}
// 'file' is the name of the field in your example:
// <input id="upload_dialog" name="file[]" type="file" multiple>
$files = maybe_ajax_files('file');