2014-02-13 345 views
2

我正在上傳文件到服務器(在這種情況下,S3)。 〜1MB以下的任何文件都可以正常工作。超過該大小的文件通常會失敗,但不是每次都是。我的流程爲小文件工作,所以這個問題似乎不在於安全性,CORS,簽名等。它似乎是在發送過程中。XmlHttpRequest PUT文件上傳停止> 1MB

小文件可以工作〜100%,但即使是較大的文件也不會立即失敗,但會觸發幾個進度事件,顯示正確的總字節數和增加的字節數,因爲它們應該是這樣。但是,在這些進展事件中的一些之後,它會觸發錯誤並停止發送。一段時間後,一個7-8MB的文件已成功,但同一個文件在其他嘗試中失敗。

下面是相關的代碼行,刪除儘可能多的絨毛。該url是一個簽名的臨時PUT請求,它正在工作並傳遞PUT調用之前的OPTIONS預檢呼叫。內容類型標頭是必需的,因爲它包含在url的簽名過程中。

xhr = new XMLHttpRequest() 
xhr.upload.onerror = (e) -> 
    console.log(xhr) 
    console.log(e) 
xhr.onerror = (e) -> 
    console.log(xhr) 
    console.log(e) 
    true 
xhr.open('PUT', url) 
xhr.setRequestHeader('content-type', file.type) 
xhr.send(file) 

我試過不同的文件,大小,擴展名和那些似乎沒有形成大小以外的任何模式。文件的大小是一個指標,但不是確切的。基於此,我查找超時並將它們設置得很大(以防萬一)。我確實試圖趕上和暫停,沒有人被解僱。

當我收到錯誤信息時,我無法找到事件xhr或xhr.upload來指示停止的原因。

Chrome工具顯示嘗試作爲狀態爲'(失敗)的PUT'。

錯誤事件顯示type =「error」但沒有其他信息。 xhr在這一點上什麼也沒有(readyState:4,response:「」,responseText:「」,responseType:「」,responseXML:null,status:0,statusText:「」)

如果有人有任何的話智慧提供甚至是一個牽強的想法嘗試,我將不勝感激。謝謝。

回答

0

也許這不是ajax請求的問題,而是服務器的配置問題。您的服務器必須接受最大1Mb的文件上傳。

如果您在您的php.ini中使用php設置upload_max_filesizepost_max_size

/* For example */ 
upload_max_filesize = 10M 
post_max_size = 10M 
+0

謝謝,@ R3tep。它似乎不是一個硬性限制,因爲有些文件有時可以運行,有時卻不能運行。在簽名的url中,我沒有限制文件大小,並且我知道服務器不限制大小,因爲我可以通過他們提供的界面上傳。 –

+0

我在stackoverflow上找到了[post](http://stackoverflow.com/questions/9004544/what-is-the-maximum-file-upload-size-with-xmlhttprequest-level-2)。它列出了使用XmlHttpRequest的所有可能的限制發送文件 – R3tep