我正在尝试使用 REST Api 和 HTML5 文件切片将一个大文件 (1.5GB) 上传到 Amazon S3。以下是上传代码的样子(为了便于阅读,代码被剥离):
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
回复: