2012-09-27 100 views
6

我試圖通過使用REST Api和HTML5文件切片將大文件(1.5GB)上傳到Amazon S3。下面是上傳代碼的樣子(剝離下來的可讀性代碼):Amazon S3 CORS PUT失敗

File.prototype.slice = File.prototype.webkitSlice || File.prototype.mozSlice || File.prototype.slice; 

var length = u.settings.chunk_size; // 6MB 
var start = chunk * length; 
var end = Math.min(start + length, u.file.size); 

var xhr = new XMLHttpRequest(); 
var path = "/" + u.settings.key; 

path += "?partNumber=" + chunk + "&uploadId=" + u.upload_id; 

var method = "PUT"; 
var authorization = "AWS " + u.settings.access_key + ":" + signature; 
var blob = u.file.slice(start, end); 

xhr.upload.addEventListener("progress", progress_handler, true); 
xhr.addEventListener("readystatechange", handler, true); 
xhr.addEventListener("error", error_handler, true); 
xhr.addEventListener("timeout", error_handler, true); 

xhr.open(method, u.settings.host + path, true); 

xhr.setRequestHeader("x-amz-date", date); 
xhr.setRequestHeader("Authorization", authorization); 
xhr.setRequestHeader("Content-Type", u.settings.content_type); 
xhr.setRequestHeader("Content-Disposition", "attachment; filename=" + u.file.name); 

xhr.send(blob); 

chunk_size爲6MB。在一個塊完成上傳之後,下一個將繼續,依此類推。但有時(每80塊左右),PUT請求失敗,e.type == "error",e.target.status == 0(令我感到意外)和e.target.responseText == ""。塊失敗後,代碼會重新嘗試上傳,並得到完全相同的錯誤。當我刷新頁面並繼續上傳(同一塊!)時,它就像一個魅力(80塊左右,當它再次卡住)。這裏的要求是如何看起來Chrome瀏覽器開發工具:

enter image description here enter image description here enter image description here

任何想法,爲什麼這件事會發生,或如何調試這樣的事情?

編輯:這裏是OPTIONS響應:

enter image description here

回答

4

我終於找到了問題的數據包嗅探:有兩個問題:

  1. PUT要求將得到一個4xx(沒有測試其它非2xx響應),在XHR請求返回的中止(狀態= 0);仍然沒有找到該解釋,退房Why does a PUT 403 show up as Aborted?

  2. 亞馬遜S3報以403提到RequestTimeTooSkewed,因爲上傳開始時我的簽名生成,15分鐘(即觸發RequestTimeTooSkewed錯誤後超時),它會失敗,簽名必須重新生成。這403錯誤是從未見過的開發者工具控制檯或JS代碼,因爲第一個問題的..

再生的簽名之後,一切工作就像一個魅力。

+0

是的,理想情況下,您可以在發送請求的同時簽署請求,而不是一開始就全部發送。 –

+0

@RyanParman是的,沒錯,但我的庫在JS中,而且我需要在服務器端生成簽名,而且我寧願向服務器發出較少的請求。 –

+0

啊,知道了。是的,這有所作爲。 :) –

2

你驗證瀏覽器是否作出任何 'OPTIONS' 請求。如果是,什麼是響應標題。

+0

查看我的編輯 –