2011-07-17 24 views
18

Tôi hiện làm cho việc sử dụng sau để tải lên một tập tin để S3:Lưu một đối tượng BufferedImage đến Amazon S3 như một tập tin

File file = new File(my_file_path); 

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

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

Trên đây hoạt động tốt nhưng tôi muốn trực tiếp tiết kiệm BufferedImage để S3 cạo một vài giây từ ứng dụng của tôi nhưng tôi không có đầu mối về cách làm điều này? Đây là cách tôi hiện đang lưu hình ảnh của tôi vào một tệp:

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

File file = new File(filepath); 

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

Có cách nào để làm việc viết trực tiếp đến Amazon S3 như một dòng suối, nếu như vậy, ai đó có thể cho thấy một ví dụ?

Ngoài ra, đây có phải là một ý tưởng hay không? Nếu nó dễ bị lỗi, tôi sẽ dính vào phương pháp hiện tại của tôi. Bất kỳ lời khuyên nào được đánh giá cao.

Trả lời

31

Thông tin sau (hoặc thứ gì đó rất giống) sẽ hoạt động tốt. Tránh bước ghi vào một tập tin vật lý nên ít bị lỗi hơn là xử lý với đĩa I/O (ít nhất, cơ hội lấp đầy đĩa của bạn theo thời gian bị giảm).

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

Điều này làm việc tuyệt vời, cảm ơn bạn jkraybill! Tôi sẽ thêm kiểu nội dung 'meta.setContentType (" image/png ");' kể từ khi tôi cố gắng mở nó trong giao diện điều khiển AWS S3, nó tiếp tục tải nó hơn là cho phép tôi xem hình ảnh. Chỉ để các độc giả tương lai của câu hỏi này không đi lên trên này. :) – Abs

+0

Vui mừng được phục vụ! – jkraybill

+0

Hoàn hảo! làm việc như nó nên được :) Cảm ơn! – Athar

0

Tôi thực sự khuyên bạn nên sử dụng API TransferManager trong SDK AWS. Bạn có thể đọc thêm về nó tại AWS blog post. Sau đây là một đoạn trích về lợi thế của nó:

Đằng sau API đơn giản này, TransferManager đang thực hiện rất nhiều công việc cho bạn. Tùy thuộc vào kích thước và nguồn dữ liệu cho quá trình tải lên của bạn, TransferManager điều chỉnh thuật toán mà nó sử dụng để xử lý quá trình chuyển của bạn, để có được hiệu suất và độ tin cậy tốt nhất. Bất cứ khi nào có thể, tải lên được chia thành nhiều phần, sao cho một số phần có thể được gửi song song để cung cấp thông lượng tốt hơn. Ngoài thông lượng cao hơn, phương pháp này cũng cho phép chuyển mạnh mẽ hơn, vì lỗi I/O trong bất kỳ phần riêng lẻ nào có nghĩa là SDK chỉ cần truyền lại một phần bị ảnh hưởng, chứ không phải chuyển toàn bộ.

Các vấn đề liên quan