2011-07-17 1 views
18

ファイルとしてアマゾンS3にBufferedImageオブジェクトを保存します。私は現在、S3にファイルをアップロードするには、以下を利用することが

File file = new File(my_file_path); 

AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred)); 

s3.putObject(new PutObjectRequest("folder", key, file)); 

以上が正常に動作しますが、私は直接剃るためにS3にBufferedImageを保存します私のアプリケーションから数秒ですが、私はこれを行う方法の手がかりがありません?

image = new BufferedImage(rawImage.width, rawImage.height, BufferedImage.TYPE_INT_ARGB); 

File file = new File(filepath); 

ImageIO.write(image, "png", file); 

ストリームとしてアマゾンS3に直接書き込みを行う方法がありますが、もしそうなら、誰かが一例を示すことができる:これは、私は現在、ファイルに自分の画像を保存する方法ですか?

さらに、これは良い考えですか?エラーが発生しやすい場合は、現在の方法に固執します。何かアドバイスをいただきました。

答えて

31

次の(または非常に似たような)うまくいくはずです。物理的なファイルに書き込むステップを避けるには、ディスクI/Oを処理するよりエラーが起こりにくいはずです(少なくとも、時間の経過とともにディスクがいっぱいになる可能性は低くなります)。

BufferedImage image = ... 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
ImageIO.write(image, "png", os); 
byte[] buffer = os.toByteArray(); 
InputStream is = new ByteArrayInputStream(buffer); 
AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred)); 
ObjectMetadata meta = new ObjectMetadata(); 
meta.setContentLength(buffer.length); 
s3.putObject(new PutObjectRequest("folder", key, is, meta)); 
+9

これは素晴らしい仕事でした。jkraybillに感謝します。コンテンツタイプ 'meta.setContentType(" image/png ");を追加します。AWS S3コンソールで開いたときに、画像を表示するのではなく、ダウンロードしていたからです。ちょうどこの質問の将来の読者がこれに乗っていないように。 :) – Abs

+0

喜んでサービスになる! – jkraybill

+0

パーフェクト!それがありますように動作:)ありがとう! – Athar

0

AWS SDKのTransferManager APIの使用を強くお勧めします。 AWS blog postで詳細を読むことができます。以下は、その利点に関するスニペットです:

この単純なAPIの背後に、TransferManagerは多くの仕事をしています。アップロードのサイズとデータソースに応じて、TransferManagerは、最高のパフォーマンスと信頼性を得るために、転送を処理するために使用するアルゴリズムを調整します。可能な限り、アップロードは複数の部分に分割されるため、複数の部分を並行して送信してより良いスループットを提供することができます。この方法では、スループットの向上だけでなく、個々の要素のI/Oエラーが、転送全体ではなく影響を受ける部分を再送信する必要があるため、より堅牢な転送も可能になります。