2012-09-10 57 views
6

XMLHttprequestでファイルをアップロードしています。 upload.php に私は、ファイルを読んで、この方法サーバー側ではXMLHttprequestを使用したファイルのアップロード - multipart/form-dataに境界がありません

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

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

すべてはことを除いて、正常に動作し ここでJSの関数であるが、それはファイルをアップロード私はPHPを得る警告:

Missing boundary in multipart/form-data POST data in Unknown on line 0

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

ここで問題になるのは何ですか?

+1

コンテンツタイプとして 'application/x-www-form-urlencoded'を試してみてください。または、これを省略してください。これは、ajaxリクエストによって送信されるデフォルトのコンテンツタイプであるためです。 –

+1

これは動作しますが、大容量のファイル(5〜600 KBでも)に対しては、ファイルを「テキスト」形式で送信する必要があるため、ブラウザはフリーズします。私は 'multipart/form data'を使う必要があります。 –

+2

申し訳ありませんが、ファイルアップロードのビットを見落としました(どのように分かりません)が、[これはあなたのquestonに答えるかもしれないと思う](http://stackoverflow.com/questions/5933949/how-to-send-multipart-form-具体的には、次のようになります。xhr.setRequestHeader( "content-type"、 "multipart/form-data; charset = utf-8; boundary =" + Math.random(data-form-content-by-ajax-no-jquery) ).toString()。substr(2)); 'トリックを行う必要があります –

答えて

8

は、まあ、これは私のために少し奇妙であるが、これは働いていたものです:

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

// !!! REMOVED ALL HEADERS 

// Send 
xhr.send(formData); 

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

これは私の問題を解決しましたが、私はまだ興味があります。なぜファイルが今度は$_FILESに表示されますか?

Chrome、Mozilla、Safari、およびIE10でテスト済みです。

+8

[仕様](http://www.w3.org/TR/XMLHttpRequest/#the-send-method)では、ブラウザが正しいヘッダーを設定していること(ポイント3)について説明しています(Content-タイプ)を選択してください。このファイルは '$ _FILES'に表示されます。なぜなら、PHPは自動的にそのスーパーグローバルのマルチパートフォームのアップロードからファイルを取得するからです(http://www.php.net/manual/en/features.file-upload.post-method.php)。 – Gijs

+0

ご理解いただきありがとうございます。 –

+0

は、 'multipart/form-data'だけが削除されました。 – ulab

関連する問題