REST APIおよびHTML5ファイルスライスを使用してAmazon S3に大きなファイル(1.5GB)をアップロードしようとしています。ここでは、アップロード・コードは(読みやすくするためにストリップダウンコード)のように見える方法は次のとおりです。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
は6メガバイトです。チャンクのアップロードが終了すると、次のチャンクが続きます。しかし時には(80チャンク程度)、PUT
要求は、e.type == "error"
,e.target.status == 0
(私を驚かせる)、e.target.responseText == ""
で失敗します。チャンクが失敗した後、コードはアップロードを再試行し、まったく同じエラーを取得します。ページをリフレッシュしてアップロードを続けると(同じチャンク!)、それはチャームのように機能します(80チャンクの場合は、再びスタックしたとき)。ここでは、要求がクロームのdevのツールでどのように見えるかです:
任意のアイデアは、なぜこれが起こる可能性がある、またはこのような何かをデバッグする方法?
EDIT:
ええ、理想的には、最初から一度に一度だけではなく、それらを送信しているようにリクエストに署名するのが理想的です。 –
@RyanParmanはい、そうですが、私の図書館はJSにあり、私はサーバー側で署名を生成する必要があります。 –
ああ、つかまります。うん、違いがあります。 :) –