現在、ファイルのアップロードを含む小さな 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 に送信することを考えましたが、アプリ サーバーが複数あると、チャンクが同じ場所に配置されるとは限りません。
私が持っていた別の考えは、アップロード中にこのすべての情報をデータベースに保存することですが、チャンク要求ごとにデータベースにアクセスする必要があるかどうかはわかりませんでした. これ以外にオプションはありますか?
どなたでもご協力いただければ幸いです。