質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3439閲覧

AWS S3でプロフィール画像をアップロード、ダウンロードしたい

encho

総合スコア182

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/03/21 01:25

#AWS S3での画像アップロードとダウンロード

teratailのプロフィール画像のような機能を実装しようとしています。
画像ファイルをAWS S3に保存して画像のpathをDBへ保存するといった形です。

ASWのファイルに対し、User情報であるuser_idを含ませて画像をアップロード
→画像のpathをDBに保存
→pathより画像をダウンロードして画面に表示
というような機能を作りたいです。

単純にファイルのアップロード、ダウンロードの機能に関しては下のコードで
できるようになりました。サンプルのため取得する画像は"sample.jpg"で指定。

この場合ユーザー情報(int userId)を加えてuploadする場合は
object keyはどのように指定するのが適切なのでしょうか?

##Controller

java

1//アップロードしている画像ファイルsample.jpgを取得し、データをレスポンス 2 @GetMapping(value = "/image", 3 headers = "Accept=image/jpeg, image/jpg, image/png, image/gif", 4 produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE, MediaType.IMAGE_GIF_VALUE}) 5 @ResponseBody 6 public ResponseEntity<BufferedImage> getImage(){ 7 return ResponseEntity.ok().body( 8 s3DownloadHelper.getImage("sample.jpg")); 9 } 10 11 12 //プロフィール画像をアップロード 13 @PostMapping("upload") 14 public String upload(UserEditForm fileUploadModel){ 15 s3UploadHelper.saveFile(fileUploadModel.getUploadFile()); 16 return "redirect:profile/edit"; 17 } 18

##uploadHelper

java

1@Component 2public class S3UploadHelper{ 3 4 private static final String S3_BUCKET_PREFIX = "s3://"; 5 private static final String DIRECTORY_DELIMITER = "/"; 6 7 @Value("backet") 8 private String bucketName; 9 10 @Autowired 11 ResourceLoader resourceLoader; 12 13 @Autowired 14 ResourcePatternResolver resourcePatternResolver; 15 16 @Autowired 17 AmazonS3 amazonS3; 18 19 20 21 public String saveFile(MultipartFile multipartFile){ 22 String objectKey = new StringBuilder() 23 .append(S3_BUCKET_PREFIX) 24 .append(bucketName) 25 .append(DIRECTORY_DELIMITER) 26 .append(multipartFile.getOriginalFilename()) 27 .toString(); 28 WritableResource writableResource = (WritableResource)resourceLoader.getResource(objectKey); 29 try(InputStream inputStream = multipartFile.getInputStream(); 30 OutputStream outputStream = writableResource.getOutputStream()){ 31 IOUtils.copy(inputStream, outputStream); 32 }catch (IOException e){ 33 e.printStackTrace(); 34 } 35 return objectKey; 36 } 37 38}

##downloadHelper

java

1import java.awt.image.BufferedImage; 2import java.io.IOException; 3import java.io.InputStream; 4 5import javax.imageio.ImageIO; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.beans.factory.annotation.Value; 9import org.springframework.core.io.Resource; 10import org.springframework.core.io.ResourceLoader; 11import org.springframework.stereotype.Component; 12 13@Component 14public class S3DownloadHelper{ 15 16 private static final String S3_BUCKET_PREFIX = "s3://"; 17 private static final String DIRECTORY_DELIMITER = "/"; 18 19 @Value("backet") 20 private String bucketName; 21 22 @Autowired 23 ResourceLoader resourceLoader; 24 25 public BufferedImage getImage(String imageFilePath){ 26 Resource resource = resourceLoader.getResource( 27 new StringBuilder() 28 .append(S3_BUCKET_PREFIX) 29 .append(bucketName) 30 .append(DIRECTORY_DELIMITER) 31 .append(imageFilePath) 32 .toString()); 33 BufferedImage image = null; 34 //InputStreamで読み込み 35 try(InputStream inputStream = resource.getInputStream()){ 36 image = ImageIO.read(inputStream); 37 }catch (IOException e){ 38 e.printStackTrace(); 39 } 40 return image; 41 } 42}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

java

1 String objectKey = new StringBuilder() 2 .append(S3_BUCKET_PREFIX) 3 .append(bucketName) 4 .append(DIRECTORY_DELIMITER) 5 .append(userId) 6 .toString();

と修正しユーザー情報を加えて画像を保存し、
ダウンロードもできるようになりました。
拡張子を加えずに画像を保存したらまずいと思っていたけどそんなこともなかった。

投稿2020/03/21 01:56

encho

総合スコア182

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問