jQuery文件上传生成奇怪的$ _FILES数组

时间:2012-12-27 18:46:03

标签: php jquery file-upload blueimp

  

可能重复:
  Weird format of $_FILES array when having multiple fields

我正在使用jQuery File Upload将文件上传到我的服务器。

这是我的处理程序:

$('#fileupload').fileupload({
    url: 'api/combox_upload.php',
    dataType: 'json',
    done: function (e, data) {
        console.log(data);
        $.each(data.result.files, function (index, file) {
            console.log(file);
            $('<p/>').text(file.name[0]).appendTo($file_uploads);
        });
    }
});

哪个运行此文件:

<?php
header('Content-type: application/json');
echo json_encode($_FILES);

但我回来的$_FILES数组看起来像这样:

{"files":{"name":["Screenshot from 2012-12-10 11:41:35.png"],"type":["image\/png"],"tmp_name":["\/var\/tmp\/phpHfnnt2"],"error":[0],"size":[180546]}}

即,files是一个对象而不是一个文件数组,每个属性(名称,类型等)都是一个数组而不是一个字符串。

我认为它们是“并行数组”,即如果上传了2个文件,则每个文件将有2个。

但这不是通常的PHP $_FILES数组的外观。 jQuery文件上传是不是搞乱了?有没有办法恢复正常结构?

他们的小例子,

        $.each(data.result.files, function (index, file) {
            $('<p/>').text(file.name).appendTo(document.body);
        });

建议它应该采用我期望的格式(files是一个数组)。

1 个答案:

答案 0 :(得分:3)

根据this answer,这似乎是预期的行为。

我们可以通过我写的这个小函数将它转换回预期的格式:

function array_zip_keys($map) {
    $result = array();
    foreach($map as $key=>$arr) {
        foreach(array_values($arr) as $i=>$el) {
            $result[$i][$key] = $el;
        }
    }
    return $result;
}

用法:

$files = array_zip_keys($_FILES['files']);