1 package org.petify.image.service; 2 3 import com.amazonaws.services.s3.AmazonS3; 4 import com.amazonaws.services.s3.model.CannedAccessControlList; 5 import com.amazonaws.services.s3.model.ListObjectsV2Result; 6 import com.amazonaws.services.s3.model.ObjectMetadata; 7 import com.amazonaws.services.s3.model.PutObjectRequest; 8 import com.amazonaws.services.s3.model.S3ObjectSummary; 9 import lombok.RequiredArgsConstructor; 10 import org.springframework.stereotype.Service; 11 import org.springframework.web.multipart.MultipartFile; 12 13 import java.io.IOException; 14 import java.util.List; 15 import java.util.UUID; 16 17 @RequiredArgsConstructor 18 @Service 19 public class StorageService { 20 private final AmazonS3 space; 21 private static final String bucketName = "petify"; 22 23 public List<String> getImageFileNames() { 24 ListObjectsV2Result result = space.listObjectsV2(bucketName); 25 List<S3ObjectSummary> objects = result.getObjectSummaries(); 26 27 return objects.stream() 28 .map(S3ObjectSummary::getKey).toList(); 29 } 30 31 public String uploadImage(MultipartFile file) { 32 try { 33 ObjectMetadata objectMetadata = new ObjectMetadata(); 34 objectMetadata.setContentType(file.getContentType()); 35 String fileName = generateImageName(); 36 space.putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), objectMetadata) 37 .withCannedAcl(CannedAccessControlList.PublicRead)); 38 return fileName; 39 } catch (IOException e) { 40 throw new RuntimeException(e); 41 } 42 } 43 44 public boolean deleteImage(String imageName) { 45 try { 46 if (space.doesObjectExist(bucketName, imageName)) { 47 space.deleteObject(bucketName, imageName); 48 return true; 49 } 50 return false; 51 } catch (Exception e) { 52 throw new RuntimeException("Failed to delete image " + imageName, e); 53 } 54 } 55 56 private String generateImageName() { 57 return UUID.randomUUID().toString(); 58 } 59 }