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"));
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 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;
}
@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로 감싸서 리턴함
}
// S3에서 파일 다운로드
public InputStream getFile(String fileName) {
GetObjectRequest request = GetObjectRequest.builder()
.bucket(bucketName)
.key(s3Path + "/" +fileName)
.build();
return s3Client.getObject(request);
}