본문 바로가기

트러블슈팅

[Aws] s3 메타데이터 설정하기

s3 메타데이터 설정하기

s3 의 파일을 브라우저에 직접 입력하면 바로 다운로드가 된다.

이유는 아무 설정하지 않은 경우 업로드 된 객체의 메타데이터 content-type 이 application/octet-stream 이기 때문이다.

이 메타데이터는 s3 객체 다운로드를 요청하면 그대로 response header 로 전달된다.

pdf 파일의 경우, 내장 pdf 뷰어를 사용하기 위해 객체 업로드 할때 또는 업로드 이후에 aws 콘솔에서 메타데이터를 조절한다.

방식 메타데이터 설정 비고
다운로드 우선 Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.jpg"
pdf 뷰어를 이용하기 위해 application/pdf 명시

Content-Disposition 가 우선하므로 attachment 이면 항상 다운로드된다.
pdf 뷰어 우선 Content-Type: application/pdf
Content-Disposition: inline; filename="filename.jpg"

 

s3 download response header 변경하기

객체를 다운로드 하는 시점에 response header 를 변경하고 싶다.

클라이언트 프로그램 내부적으로 변경할 수 도 있고, s3 sdk 에서 GetObjectRequest 를 만들때 변경할 수도 있다.

- 브라우저 + header 변경 프로그램 : modheader

- presigned url 만들 때 변경하는 방법

// Get an entire object, overriding the specified response headers, and print the object's content.
ResponseHeaderOverrides headerOverrides = new ResponseHeaderOverrides()
        .withCacheControl("No-cache")
        .withContentDisposition("attachment; filename=example.txt");
GetObjectRequest getObjectRequestHeaderOverride = new GetObjectRequest(bucketName, key)
        .withResponseHeaders(headerOverrides);

// 비슷한 방식으로 PresignedUrl 을 만들때도 사용 가능
GeneratePresignedUrlRequest(bucketName, key, method)
    .withResponseHeaders(ResponseHeaderOverrides().withContentDisposition("attachment; filename=filename.jpg"))
    .withExpiration(expiration)

 

한글 파일명이 깨지는 경우

브라우저별로 인코딩이 필요하다.

크롬 기준으로 utf-8 인코딩하면 해결됨

URLEncoder.encode(fileName, Charsets.UTF_8)