web-dev-qa-db-ja.com

XMLHttprequestを使用してファイルをアップロードする-multipart / form-dataに境界がありません

XMLHttprequestを使用してファイルをアップロードしています。ファイルをアップロードするJS関数は次のとおりです。

_var upload = function(file) {
    // Create form data
    var formData = new FormData();
    formData.append('file', file);

    var xhr = new XMLHttpRequest();

    // Open
    xhr.open('POST', this.options.action);

    // Set headers
    xhr.setRequestHeader("Cache-Control", "no-cache");
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xhr.setRequestHeader("Content-Type", "multipart/form-data");
    xhr.setRequestHeader("X-File-Name", file.fileName);
    xhr.setRequestHeader("X-File-Size", file.fileSize);
    xhr.setRequestHeader("X-File-Type", file.type);

    // Send
    xhr.send(formData);
}
_

サーバー側では、pload.phpで次のようにファイルを読み取ります。

_file_put_contents($filename, (file_get_contents('php://input')));
_

PHP警告:

_Missing boundary in multipart/form-data POST data in Unknown on line 0_。

この行を削除すると:xhr.setRequestHeader("Content-Type", "multipart/form-data");警告が消えます。

ここで何が問題になるのでしょうか?

8
Tamás Pap

これは私にとって少し奇妙ですが、これがうまくいったことです:

// Open
xhr.open('POST', this.options.action, true);

// !!! REMOVED ALL HEADERS

// Send
xhr.send(formData);

この場合、サーバー側ではphp://input経由で送信されたファイルを読み取りませんが、ファイルは$_FILES配列にあります。

これで問題は解決しましたが、ファイルが$_FILESに表示されるのはなぜですか?

Chrome、Mozilla、Safari、IE10でテスト済み。

11
Tamás Pap