6

REST ApiとHTML5ファイルスライスを使用して、大きなファイル(1.5GB)をAmazonS3にアップロードしようとしています。アップロードコードは次のようになります(読みやすくするためにコードを削除)。

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_size6MBです。チャンクのアップロードが完了すると、次のチャンクが続きます。ただし、場合によっては(80チャンクごと)、PUTリクエストが失敗し、、e.type == "error"e.target.status == 0これは私を驚かせます)、およびe.target.responseText == ""。チャンクが失敗した後、コードはそれをアップロードしようと再試行し、まったく同じエラーを受け取ります。ページを更新してアップロードを続行すると(同じチャンク!)、チャームのように機能します(80チャンク程度の場合、再びスタックすると)。Chrome開発ツールでリクエストがどのように表示されるかを次に示します。

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

なぜこれが起こるのか、またはこのようなものをデバッグする方法はありますか?

編集:これがOPTIONS応答です:

ここに画像の説明を入力してください

4

2 に答える 2

4

私はついにパケットをスニッフィングすることによって問題を見つけました:2つの問題があります:

  1. (他の非応答をテストしなかった)PUTを取得するリクエストの場合、xhrリクエストは中止されたものとして返されます(ステータス= 0)。その説明がまだ見つかりません。PUT403がAbortedとして表示されるのはなぜですか。4xx2xx

  2. Amazon S3は、アップロードの開始時に署名が生成され、15分(エラーをトリガーするタイムアウト)後に失敗し、署名を再生成する必要があるため、403と答えました。その403エラーは、最初の問題のため、開発ツールコンソールやjsコードでは見られません。RequestTimeTooSkewedRequestTimeTooSkewed

署名を再生成した後、すべてが魅力のように機能します。

于 2012-09-28T08:18:23.290 に答える
2

ブラウザが「OPTIONS」リクエストを行っているかどうかを確認しましたか。はいの場合、応答ヘッダーは何ですか。

于 2012-09-27T23:41:25.333 に答える