#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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。