2011-07-17 26 views
18

Actualmente hago uso de los siguientes para cargar un archivo en S3:guardar un objeto BufferedImage a Amazon S3 como un archivo

File file = new File(my_file_path); 

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

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

Lo anterior funciona bien pero quiero guardar directamente un BufferedImage a S3 para afeitarse unos segundos de mi aplicación pero no tengo ni idea de cómo hacer esto? Esta es la forma en la actualidad guardo mi imagen en un archivo:

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

File file = new File(filepath); 

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

¿Hay una manera de hacer la escritura directamente a Amazon S3 como una corriente, de ser así, alguien puede mostrar un ejemplo?

Además, ¿es esta una buena idea? Si es propenso a errores, me atendré a mi método actual. Cualquier consejo apreciado.

Respuesta

31

Lo siguiente (o algo muy similar) debería funcionar bien. Evitar el paso de escribir en un archivo físico debería ser ligeramente menos propenso a errores que tratar con E/S de disco (como mínimo, se reducen las posibilidades de que su disco se llene con el tiempo).

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

Esto funcionó muy bien, gracias jkraybill! Agregaría el tipo de contenido 'meta.setContentType (" image/png ");' ya que cuando traté de abrirlo en la consola AWS S3 siguió descargándolo en lugar de dejarme ver la imagen. Solo para que los futuros lectores de esta pregunta no tropiecen con esto. :) – Abs

+0

¡Me alegro de estar de servicio! – jkraybill

+0

¡Perfecto! funciona como debería ser :) ¡Gracias! – Athar

0

Recomendaría encarecidamente usar la API de TransferManager en AWS SDK. Puede leer más sobre esto en el AWS blog post. El siguiente es un fragmento con respecto a su ventaja:

Detrás de esta API simple, TransferManager está haciendo un gran trabajo por usted. Según el tamaño y la fuente de datos para su carga, TransferManager ajusta el algoritmo que usa para procesar su transferencia, a fin de obtener el mejor rendimiento y confiabilidad. Siempre que sea posible, las cargas se dividen en varias piezas, de modo que varias piezas se pueden enviar en paralelo para proporcionar un mejor rendimiento. Además de un mayor rendimiento, este enfoque también permite transferencias más sólidas, ya que un error de E/S en cualquier pieza individual significa que el SDK solo necesita retransmitir la pieza afectada, y no toda la transferencia.