やりたいこと
画像がBufferedImageの形式で存在する時に
その画像をAWSのS3にアップロードしたいです。
環境
- Java8
- PlayFramework
現状
現在は下記のコードでアップロードをしようとするとエラーは出ないのですが、
アップロードがされません。
BufferedImage thumbnailImage = ... // S3に対してMeta情報を付加 ObjectMetadata metaData = new ObjectMetadata(); // 拡張子を取得 String extension = SetExtension.setExtension(imageFile.getFilename()); // byte配列からS3へアップロードするInputStreamへ変換をする ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(thumbnailImage, extension, baos); baos.flush(); byte[] imageInByte = baos.toByteArray(); baos.close(); in = new ByteArrayInputStream(imageInByte); // content-typeを設定 metaData.setContentType("image/" + extension); // S3に保存 s3.putObject(new PutObjectRequest(BUCKET_NAME, fileName, in, metaData));
これを実行した時は下記のメッセージがコンソール上に表示されてアップロードできません。
[warn] c.a.s.s.AmazonS3Client - No content length specified for stream data. Stream contents will be buffered in memory and could result in out of memory errors.
対応
InputStreamのバイト長を予測させないといけないということで、下記のURLを参考に変更をしました。
https://groups.google.com/forum/#!topic/google-appengine-stackoverflow/yo40fKxqrv8
BufferedImage thumbnailImage = ... // S3に対してMeta情報を付加 ObjectMetadata metaData = new ObjectMetadata(); // 拡張子を取得 String extension = SetExtension.setExtension(imageFile.getFilename()); // byte配列からS3へアップロードするInputStreamへ変換をする ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(thumbnailImage, extension, baos); baos.flush(); byte[] imageInByte = baos.toByteArray(); baos.close(); in = new ByteArrayInputStream(imageInByte); // バイト長を取得(追加) byte[] contentBytes = IOUtils.toByteArray(in); Long contentLength = Long.valueOf(contentBytes.length); // content-typeを設定 metaData.setContentType("image/" + extension); // バイト長を設定(追加) metaData.setContentLength(contentLength); // S3に保存 s3.putObject(new PutObjectRequest(BUCKET_NAME, fileName, in, metaData));
これでアップロード処理を行うと下記のエラーがでてしまいます。
[error] p.c.s.n.PlayDefaultUpstreamHandler - Cannot invoke the action com.amazonaws.AmazonClientException: Data read has a different length than the expected: dataLength=0; expectedLength=19539; includeSkipped=false; in.getClass()=class com.amazonaws.internal.ReleasableInputStream; markedSupported=true; marked=0; resetSinceLastMarked=false; markCount=1; resetCount=0 at com.amazonaws.util.LengthCheckInputStream.checkLength(LengthCheckInputStream.java:150) ~[aws-java-sdk-core-1.10.62.jar:na] at com.amazonaws.util.LengthCheckInputStream.read(LengthCheckInputStream.java:110) ~[aws-java-sdk-core-1.10.62.jar:na] at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:72) ~[aws-java-sdk-core-1.10.62.jar:na] at com.amazonaws.services.s3.internal.MD5DigestCalculatingInputStream.read(MD5DigestCalculatingInputStream.java:98) ~[aws-java-sdk-s3-1.10.62.jar:na] at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:72) ~[aws-java-sdk-core-1.10.62.jar:na] at com.amazonaws.event.ProgressInputStream.read(ProgressInputStream.java:151) ~[aws-java-sdk-core-1.10.62.jar:na] at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:72) ~[aws-java-sdk-core-1.10.62.jar:na] at org.apache.http.entity.InputStreamEntity.writeTo(InputStreamEntity.java:138) ~[httpcore-4.3.3.jar:4.3.3] at com.amazonaws.http.RepeatableInputStreamRequestEntity.writeTo(RepeatableInputStreamRequestEntity.java:153) ~[aws-java-sdk-core-1.10.62.jar:na] at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:89) ~[httpcore-4.3.3.jar:4.3.3] [error] application -
どなたかご教授お願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/20 09:47