스프링 컨트롤러에서 파일 다운로드 시키기

다른 예제들을 보면 User-Agent 헤더에 따라 인코딩을 변경해주던데.. 혹시나해서 아래 코드로 통일 시켰더니 5개의 브라우저 모두 한글 파일명으로 제대로 다운 받을 수 있었다.

아래의 예제는 byte[] 배열을 파일로 받을 수 있게 구현했다.

@RequestMapping(value ="/download")
public ResponseEntity<byte[]> downloadTest(@RequestHeader(name = HttpHeaders.USER_AGENT) String userAgent){
  byte [] file = "다운로드파일".getBytes();
  HttpHeaders guavaHeader = new HttpHeaders();
  /*
   *
   * Edge랑 Chrome은 다운로드 받을건지 안물어보는데 혹시 이유 아시는분 댓글좀여 ㅜ
   *
   * Chrome  : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
   * FireFox : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0
   * Edge : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.52
   * IE : Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
   * IPhone Safari : Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1
   *
   */
  log.debug("##### userAgent : " + userAgent);

   /*
    * 이 타입은 이진 파일을 위한 기본값입니다.
    * 이 타입은 실제로 잘 알려지지 않은 이진 파일을 의미하므로, 브라우저는 보통 자동으로 실행하지 않거나 실행해야 할C지 묻기도 합니다.
    * Content-Disposition 헤더가 값 attachment 와 함게 설정되었고 'Save As' 파일을 제안하는지 여부에 따라 브라우저가 그것을 다루게 됩니다.
    */
  guavaHeader.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  guavaHeader.set("Content-Disposition", "attachment; filename=" + new String("하이.txt".getBytes(), StandardCharsets.ISO_8859_1));
  return new ResponseEntity<>(file, guavaHeader, HttpStatus.OK);
}

+ Recent posts