我試圖通過使用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瀏覽器開發工具:
任何想法,爲什麼這件事會發生,或如何調試這樣的事情?
編輯:這裏是OPTIONS
響應:
是的,理想情況下,您可以在發送請求的同時簽署請求,而不是一開始就全部發送。 –
@RyanParman是的,沒錯,但我的庫在JS中,而且我需要在服務器端生成簽名,而且我寧願向服務器發出較少的請求。 –
啊,知道了。是的,這有所作爲。 :) –