【问题标题】:Amazon S3 CORS PUT failsAmazon S3 CORS PUT 失败
【发布时间】:2012-09-19 07:05:57
【问题描述】:

我正在尝试使用 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 回复:

【问题讨论】:

    标签: javascript html amazon-s3 xmlhttprequest cors


    【解决方案1】:

    我通过嗅探数据包终于找到了问题:有两个问题:

    1. 对于获得4xxPUT 请求(未测试其他非2xx 响应),xhr 请求返回为中止(状态 = 0);仍然没有找到解释,请查看Why does a PUT 403 show up as Aborted?

    2. Amazon S3 回复了一个 403,上面写着 RequestTimeTooSkewed,因为我的签名是在上传开始时生成的,并且在 15 分钟后(触发 RequestTimeTooSkewed 错误的超时),它失败了,并且必须重新生成签名。由于第一个问题,开发工具控制台或 js 代码中从未出现过 403 错误。

    重新生成签名后,一切都像魅力一样工作。

    【讨论】:

    • 是的,理想情况下,您会在发送请求时签署请求,而不是一开始就一次性签署。
    • @RyanParman 是的,没错,但是我的库是在 JS 中的,我需要在服务器端生成签名,我宁愿对服务器发出更少的请求。
    • 啊,明白了。是的,这会有所不同。 :)
    【解决方案2】:

    您是否验证了浏览器是否正在发出任何“OPTIONS”请求。如果是,响应标头是什么。

    【讨论】:

      猜你喜欢
      • 2014-08-22
      • 2012-10-23
      • 2015-03-09
      • 2013-03-06
      • 1970-01-01
      • 2016-02-08
      • 2021-10-26
      • 2013-05-03
      • 2016-09-04
      相关资源
      最近更新 更多