2012-09-27 8 views
6

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のツールでどのように見えるかです:

enter image description here enter image description here enter image description here

任意のアイデアは、なぜこれが起こる可能性がある、またはこのような何かをデバッグする方法?

EDIT:

enter image description here

答えて

4

私は最終的にパケットを盗聴して、問題を発見した:4xx(他の非2xx応答をテストしていない)を取得

  1. PUTの要求、XHRリクエストが戻るよう:二つの問題があります中止されました(ステータス= 0)。まだそのための説明を発見していない、Why does a PUT 403 show up as Aborted?

  2. をチェックアウトするAmazon S3のアップロードが開始したときに私の署名が生成されるため、RequestTimeTooSkewed言っ403で応答し、そして15分後(RequestTimeTooSkewedエラーをトリガタイムアウト)、失敗し、署名を再生成する必要があります。その403エラーが原因で最初の問題のため、開発ツールのコンソールやjsのコードで見たことはありません。..

署名を再生した後、すべてが魔法のように動作します。

+0

ええ、理想的には、最初から一度に一度だけではなく、それらを送信しているようにリクエストに署名するのが理想的です。 –

+0

@RyanParmanはい、そうですが、私の図書館はJSにあり、私はサーバー側で署名を生成する必要があります。 –

+0

ああ、つかまります。うん、違いがあります。 :) –

2

あなたはブラウザが任意の 'オプション' 要求を行っているかどうかを確認しました:ここOPTIONS応答があります。はいの場合、応答ヘッダーは何ですか。

+0

私の編集をチェックしてください –

関連する問題