S3 CRUD

작심삼일·2024년 6월 18일

Controller

@RestController
@RequestMapping("/api/users")
public class userController {


    @PostMapping("/fileupload")
    public ResponseEntity<Map<String,String>> upload(@RequestParam("file") MultipartFile multipart,@RequestParam Map<String,Object> userMap){
        String fileName = multipart.getOriginalFilename();
        String message = "";
        try {
            message = S3Util.uploadFile(fileName,multipart.getInputStream());
        } catch (Exception ex){
            message = "Error uploading file" + ex.getMessage();
        }

        String firstName = (String) userMap.get("firstName");
        Map<String, String> map = new HashMap<>();
        map.put("firstName", firstName);
        map.put("message", message);

        return new ResponseEntity<>(map, HttpStatus.OK);
    }

}

MultipartFile

Multipart란?

  • 웹 클라이언트가 요청을 보낼 때, HTTP 프로토콜의 바디 부분에 데이터를 여러 부분으로 나눠서 보내는 것입니다.
  • 웹 클라이언트가 서버에게 파일을 업로드할 때, http 프로토콜의 바디 부분에 파일정보를 담아서 전송을 하는데, 파일을 한번에 여러개 전송을 하면 body 부분에 파일이 여러개의 부분으로 연결되어 전송됩니다.
  • 이렇게 여러 부분으로 나뉘어서 전송되는 것은 Multipart data라고 합니다.
    보통 파일을 전송할 때 사용합니다.

MultipartFile 이란?
사용자가 업로드한 File을 핸들러에서 손쉽게 다룰 수 있게 도와주는 매개변수 중 하나입니다.

  • MultipartFile 인터페이스는 스프링에서 업로드 한 파일을 표현할 때 사용되는 인터페이스입니다.
  • MultipartFile 인터페이스를 이용해서 업로드한 파일의 이름, 실제 데이터, 파일 크기 등을 구할 수 있습니다.

출처
https://antstudy.tistory.com/308

S3Util

public class S3Util {
    public static final String BUCKET = "bucketname";

    public static String uploadFile(String fileName, InputStream inputStream)
            throws S3Exception, AwsServiceException, SdkClientException, IOException {

        AwsBasicCredentials credentials = AwsBasicCredentials.create("awsAccessKey","awsSecretAcessKey");

        S3Client client = S3Client.builder()
                .region(Region.AP_NORTHEAST_2)
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .build();

        PutObjectRequest request = PutObjectRequest.builder()
                .bucket(BUCKET)
                .key(fileName)
                .build();

        client.putObject(request,
                RequestBody.fromInputStream(inputStream,inputStream.available()));
        System.out.println("File uploaded successfully to S3");

        S3Presigner presigner = S3Presigner.create();

        GetObjectRequest objectRequest = GetObjectRequest.builder()
                .bucket(BUCKET)
                .key(fileName)
                .build();

        GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
                .signatureDuration(Duration.ofHours(1)) // The URL will expire in 10 minutes
                .getObjectRequest(objectRequest)
                .build();

        PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest);

        return presignedRequest.url().toExternalForm();
    }

}

CorsFilter

@Bean
    public FilterRegistrationBean<CorsFilter> corsFilter() {
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        registrationBean.setFilter(new CorsFilter(source)); // CorsConfiguration을 직접 전달합니다
        registrationBean.setOrder(1);
        return registrationBean;
    }
profile
still searching....

0개의 댓글