2

非表示のiframeを介したアップロードへのフォールバックを使用して、javascriptFileAPIとXmlHttpRequestを使用してファイルアップローダーを構築しています。両方のアップロードはPHPで処理されます。

ただし、$_FILES配列の構造に厄介な違いがあることがわかりました。

iframeフォールバックを使用する場合、配列は次のようになります。

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

(私はfiles []と呼ばれる複数の入力を使用しています)

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);

現時点では、このように2つの異なる配列を解析していますが、これは機能しているようです。

 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 に答える