2

我正在使用 javascript FileAPI 和 XmlHttpRequest 构建一个文件上传器,并回退到通过隐藏的 iframe 上传。两个上传都使用 PHP 处理。

然而,我发现 $_FILES 数组的结构方式存在令人讨厌的差异。

使用 iframe 后备时,数组将如下所示:

$_FILES = array(
    'files' => array(
        'name' => array(
            0 => 'name.jpg'
        ),
        'type' => array(
            0 => 'image/jpeg'
        )
        ...
    )
)

(我正在使用称为文件 [] 的多个输入)

当我使用 XmlHttpRequest 上传时,数组如下所示:

$_FILES = array(
    'filename' => array(
        'name' => 'name.jpg',
        'type' => 'image/jpeg'
        ...
    ),
    ...
)

有什么方法可以使这种行为方式相同吗?您可以在下面找到我如何构建我的 xhr 请求:

var data = new FormData(), xhr = new XMLHttpRequest();

data.append(file.name, file);

xhr.open('POST', 'process.php', true);

xhr.onload = function(e) {
    ...
};
xhr.send(data);

目前我像这样解析两个不同的数组,这似乎有效。

 if(isset($_FILES['files']['name']))
 { // old skool $_FILES array
    foreach($_FILES['files'] as $key => $values)
    {
        foreach($values as $index => $value)
        {
            $files[$index][$key] = $value;
        }
    }
 } 
 else
 { // XMLHttpRequest $_FILES
    $files = $_FILES;
 }
4

1 回答 1

2

不,这是 PHP 处理基于数组的文件字段命名的完全愚蠢的方式。如果你有

<input type="file" name="whatever[]" />
                                 ^^---

你会得到你所看到的愚蠢的基于子阵列的版本。没有办法解决这个问题 - 它内置在 PHP 的核心中。

于 2012-10-26T14:41:44.487 回答