2016-05-16 9 views
1

WebアプリケーションからのAWS S3ストレージへの転送を処理するヘルパークラスを実装しています。ファイルの代わりにファイルをダウンロードする

私のクラスの最初のバージョンでは、アップロードとダウンロードを処理するためにAmazonS3Clientを直接使用していましたが、今ではTransferManagerが見つかりました。これを使用するためにコードをリファクタリングしたいと思います。

私のダウンロード方法では、格納されたファイルをbyte[]の形式で返すという問題があります。 TransferManagerには、代わりにFileをダウンロード先として使用するメソッドしかありません(たとえばdownload(GetObjectRequest getObjectRequest, File file))。

私の以前のコードは次のようなものだった:

GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, key); 
S3Object s3Object = amazonS3Client.getObject(getObjectRequest); 
S3ObjectInputStream objectInputStream = s3Object.getObjectContent(); 
byte[] bytes = IOUtils.toByteArray(objectInputStream); 

私は単にAmazonS3Clientインスタンスを使用し続けるべきかTransferManagerを同じように使用する方法はありますか?

+1

すべてのバイトをメモリにロードするのは良い方法ではありません。ファイルを返すことと、読み込むために入力ストリームを開くことを考えてください。大きなファイルを処理するときにアプリケーションがクラッシュすることはありません。 – andrucz

答えて

3

TransferManagerは、ファイルを並列にダウンロードするときにファイルロックなどのオブジェクトをサポートするためにオブジェクトを使用します。直接OutputStreamを使用することはできません。一度に1つずつS3から小さなファイルをダウンロードするような要件が単純な場合は、getObjectを使用してください。

そうでなければ、File.createTempFileで一時ファイルを作成し、ダウンロードが完了したらその内容をバイト配列に読み込むことができます。

+0

説明をありがとうございます。私は一時ファイルを使用します。 – davioooh

関連する問題