1

現在、ファイルのアップロードを含む小さな Web アプリがあります。現在、大きなファイルをアップロードできるように、チャンクを有効にしてクライアントでPluploadを使用しています。ファイルはアプリ サーバーに保存され、チャンクは表示されるたびに追加されます。

現在、複数のアプリサーバーの可能性を備えたファイルストレージ用にAmazon S3に移行しています。これらのチャンクを処理する方法が難しいと感じています。私は彼らの例に従おうとしていましたが、問題が発生しています。私がしようとしているものの肉は次のようになります:

UploadPartRequest uploadRequest = new UploadPartRequest()
    .withBucketName(bucket).withKey(key)
    .withUploadId(uploadId).withPartNumber(partNumber)
    .withPartSize(bytes.length)
    .withInputStream(new ByteArrayInputStream(bytes));

s3Client.uploadPart(uploadRequest);

私が抱えている問題は、チャンクの uploadId を何らかの方法で知る必要があることです。アップロードの初期化から取得したときにそれを持っていInitiateMultipartUploadResultますが、それを後で発生するチャンクとどのように関連付けますか? おそらく最初の応答でそれを送信し、その後、各チャンク要求でそれを送り返すことができると思いました. それはあまりにも遠いようには思えませんでした。

次に、アップロードを完了するには、各アップロードから Amazon S3 に返される s が必要であることがわかりましたList<PartETag>。それで、私の次の質問は、ブラウザからチャンクがアップロードされている間に、PartETagこれらすべての s をどのように保存するかということでした。PartETag私が最初に考えたのはPartETag、応答で各チャンクを送信し、それらのクライアント側を保存できるということでした。これらすべての s を送信できるように、最後のチャンクがいつアップロードされているかを知る方法があるかどうかはわかりませんPartETag。そうでない場合は、毎回持っているすべてのものを送信する必要があり、最後のリクエストのみがそれらを使用します。これはすべて私には少しハッキーなようです。

ですから、誰かが以前にこれに対処したことがあると思います。これを行う良い標準的な方法はありますか?

アプリ サーバーでファイルを作成してから S3 に送信することを考えましたが、アプリ サーバーが複数あると、チャンクが同じ場所に配置されるとは限りません。

私が持っていた別の考えは、アップロード中にこのすべての情報をデータベースに保存することですが、チャンク要求ごとにデータベースにアクセスする必要があるかどうかはわかりませんでした. これ以外にオプションはありますか?

どなたでもご協力いただければ幸いです。

4

2 に答える 2

1

当社のIaaSソリューションをお試しください:

https://uploadcare.com

5GBまでのファイルサイズに対応しています。これは、当社のシステムを使用して大きなファイルをアップロードするための成功事例に関する記事です。

https://community.skuidify.com/skuid/topics/how_to_upload_large_files_using_uploadcare_com

于 2014-12-04T22:39:44.570 に答える
0

私が間違っている場合は訂正してください。ただし、あなたの質問を理解しているので、Web サーバーはブラウザーとクライアントの間のプロキシとして機能します。

私が抱えている問題は、チャンクの uploadId を何らかの方法で知る必要があることです。アップロードの初期化から InitiateMultipartUploadResult を取得したときにそれを取得しましたが、それを後で発生するチャンクと関連付けるにはどうすればよいですか?

この回答のように、 as querystring パラメータをBeforeUpload追加できますuploadId

私が最初に考えたのは、応答で各チャンクの PartETag を送信し、それらのクライアント側を保存できるということでした。

これは良い考えのようです。次に、「ChunkUploaded」で上記のようにクエリ文字列を変更して、受信したばかりの を追加し、リクエストごとにPartETag以前に受信したすべてを転送します。PartETagチャンク間でクエリ文字列を変更できるかどうか、または次のチャンクのアップロードが開始される前に何らかの処理を同期的に実行できるかどうかはわかりませんが、試してみる価値はあります。

これらすべての PartETag を送信できるように、最後のチャンクがいつアップロードされているかを知る方法があるかどうかはわかりません。

これは、plupload ダウンロードの php サンプルにあります。plupload によって 2 つの POST パラメータがサーバーに送信されます。

  • chunks : アップロードのチャンクの総数 (アップロードがチャンク化されていない場合は 0)
  • chunk : アップロード中の現在のチャンクのインデックス

最後のチャンクはいつchunks==0 || chunk==chunks-1

于 2013-11-26T14:54:22.213 に答える