Gab*_*aru 6 javascript html5 xmlhttprequest amazon-s3 cors
我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)
chunk_size是6MB.块完成上传后,下一个块跟随,依此类推.但有时候(每80块左右),PUT请求失败了e.type == "error",e.target.status == 0(让我感到惊讶),和e.target.responseText == "".块失败后,代码会重新尝试上传它,并获得完全相同的错误.当我刷新页面并继续上传(相同的块!)时,它就像一个魅力(80块左右,当它再次卡住时).以下是Chrome开发工具中请求的外观:

任何想法为什么会发生这种情况,或者如何调试这样的东西?
编辑:这是OPTIONS回复:

我终于通过嗅包发现了问题:有两个问题:
对于PUT获得 a 的请求4xx(未测试其他非2xx响应),xhr 请求返回为已中止(状态 = 0);仍然没有找到对此的解释,请查看为什么 PUT 403 显示为 Aborted?
Amazon S3 回复403说RequestTimeTooSkewed,因为我的签名是在上传开始时生成的,15 分钟后(触发错误的超时RequestTimeTooSkewed),它失败,必须重新生成签名。由于第一个问题,403 错误在开发工具控制台或 js 代码中从未出现过。
重新生成签名后,一切都变得非常顺利。
| 归档时间: |
|
| 查看次数: |
2451 次 |
| 最近记录: |