2011-07-17 5 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 오류가 SDK가 전체 전송이 아닌 영향을받은 부분을 재전송하기 만하면되므로 더 강력한 전송을 가능하게합니다.

관련 문제