2012-09-10 108 views
6

我使用XMLHttprequest上傳文件。 這裏是JS功能,將文件上載:使用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); 
} 

在服務器端,在upload.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");警告消失。

這裏應該是什麼問題?

+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

[The spec](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

相關問題