2011-07-17 4 views
18

Je fais actuellement l'utilisation des éléments suivants pour télécharger un fichier à S3:Enregistrer un objet BufferedImage à Amazon S3 comme un fichier

File file = new File(my_file_path); 

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

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

Les travaux ci-dessus bien, mais je veux enregistrer directement un BufferedImage à S3 de se raser quelques secondes de mon application mais je n'ai aucune idée sur la façon de faire cela? Voici comment je sauve actuellement mon image dans un fichier:

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

File file = new File(filepath); 

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

est-il un moyen de faire de l'écriture directement à Amazon S3 comme un flux, le cas échéant, quelqu'un peut-il montrer un exemple?

En outre, est-ce une bonne idée? Si elle est sujette aux erreurs, je vais m'en tenir à ma méthode actuelle. Tout conseil apprécié.

Répondre

31

Les éléments suivants (ou quelque chose de très similaire) devraient fonctionner correctement. Éviter l'étape d'écriture dans un fichier physique devrait être légèrement moins sujette aux erreurs que de traiter les E/S disque (à tout le moins, vos chances de remplir votre disque au fil du temps sont réduites).

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

Cela a très bien fonctionné, merci jkraybill! J'ajouterais le type de contenu 'meta.setContentType (" image/png ");' puisque lorsque j'ai essayé de l'ouvrir dans la console AWS S3, il a continué à le télécharger plutôt que de me laisser voir l'image. Juste pour que les futurs lecteurs de cette question ne trébuchent pas là-dessus. :) – Abs

+0

Content d'être utile! – jkraybill

+0

Parfait! fonctionne comme il se doit :) Merci! – Athar

0

Je recommande fortement d'utiliser l'API TransferManager dans le kit SDK AWS. Vous pouvez en lire plus à ce sujet au AWS blog post. Ce qui suit est un extrait de son avantage:

Derrière cette API simple, TransferManager fait beaucoup de travail pour vous. En fonction de la taille et de la source de données pour votre téléchargement, TransferManager ajuste l'algorithme utilisé pour traiter votre transfert, afin d'obtenir les meilleures performances et la meilleure fiabilité. Chaque fois que cela est possible, les envois sont divisés en plusieurs parties, de sorte que plusieurs éléments peuvent être envoyés en parallèle pour fournir un meilleur débit. En plus d'un débit plus élevé, cette approche permet également des transferts plus robustes, puisqu'une erreur d'E/S dans n'importe quelle pièce signifie que le SDK n'a besoin que de retransmettre la pièce affectée, et non le transfert entier.