AWS S3 파일 업로드/다운로드

haruceki·2024년 10월 17일
0

PutObjectRequest는 AWS SDK for Java에서 Amazon S3 (Simple Storage Service)에 객체(파일 또는 데이터를) 업로드할 때 사용하는 클래스이다. 이 클래스는 S3 버킷에 데이터를 업로드하는 요청을 구성하는 데 사용되며, 파일 경로, S3 버킷, 키(파일 이름), 메타데이터 등의 정보를 설정할 수 있다.

PutObjectRequest는 주로 파일을 S3에 저장할 때 필요한 정보를 담고 있으며, 이를 이용해 객체를 S3 버킷에 업로드한다.

  • 파일 업로드 생성자
PutObjectRequest(String bucketName, String key, File file)
//S3 버킷이름, 파일 이름(식별용), 파일 객체

(ex) 
PutObjectRequest request = new PutObjectRequest("bucket-name", "file-key", new File("local-file-path"));
  • InputStream 업로드 생성자
PutObjectRequest(String bucketName, String key, InputStream input, ObjectMetadata metadata)
//S3 버킷 이름, 파일이름, 업로드할 데이터가 포함된 inputStream, 파일에 대한 메타데이터

(ex) 
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("image/jpeg");

PutObjectRequest request = new PutObjectRequest("bucket-name", "file-key", inputStream, objectMetadata);

GetObjectRequest는 AWS SDK에서 Amazon S3로부터 파일 객체를 다운로드하거나 가져올 때 사용하는 요청 객체이다. 이 클래스는 S3에서 특정 객체를 가져오는 데 필요한 버킷 이름과 키(key)와 같은 정보를 담고 있다.

  • GetObjectRequest 생성자
GetObjectRequest request = new GetObjectRequest("bucket-name", "file-key")
                             .withRange(0, 1023); // 첫 번째 1024 바이트만 다운로드

파일 업로드

@Service
public class FileUploadService  {

    private final S3Client s3Client;
    private final String bucketName;
    private final String s3Path;

    public FileUploadService(
            S3Client s3Client,
            @Value("${s3.bucket-name}") String bucketName,
            @Value("${s3.path}") String s3Path
    ) {
        this.s3Client = s3Client;
        this.bucketName = bucketName;
        this.s3Path = s3Path;
    }

    @SneakyThrows
    public String uploadImage(MultipartFile multipartFile) {
        String uploadUrl = s3Path + "/" + multipartFile.getOriginalFilename();
        
        //PutObjectRequest는 s3에 객체 업로드 요청 사용하는 클래스이다.
        PutObjectRequest request = PutObjectRequest.builder()
                .bucket(bucketName)
                .key(uploadUrl)
                .build();

        RequestBody content = RequestBody.fromInputStream(
                multipartFile.getInputStream(),
                multipartFile.getSize()
        );

        s3Client.putObject(request, content);
        return uploadUrl;
    }

    private String getS3UploadUrl(String fileName) {
        return s3Path + "/" + fileName;
    }

파일 다운로드

  • Controller
@GetMapping
    public ResponseEntity<InputStreamResource> getImage(@RequestParam(value = "file") String fileName) throws IOException {
        InputStream imageStream = fileUploadService.getFile(fileName);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"") //다운로드할 파일 이름을 설정하는 것
                .contentType(MediaType.IMAGE_JPEG) // 혹은 png일 경우 IMAGE_PNG로 바꿔줘야함
                .body(new InputStreamResource(imageStream)); //imageStream로 바로 리턴안되므로 InputStreamResource로 감싸서 리턴함
    }
  • Service
    // S3에서 파일 다운로드
    public InputStream getFile(String fileName) {
        GetObjectRequest request = GetObjectRequest.builder()
                .bucket(bucketName)
                .key(s3Path + "/" +fileName)
                .build();
                
        return s3Client.getObject(request);
    }
profile
희망도 절망도 없이 매일 코딩을 한다.

0개의 댓글