요르딩딩
스프링 첨부파일다운로드 (반환타입 :ResponseEntity) 본문
내가 사용한 로직은 DB에 파일,파일명을 저장하고, 그것을 첨부파일형태로 불러온다.
반환타입 : ResponseEntity
: 스프링프레임워크에서 제공하는 클래스에 HttpEntity클래스가 존재한다.
이것은 요청이나 응답에 해당하는 HttpHeader, HttpBody를 를 가지고 있습니다.
RequestEntity,ResponseEntity는 HttpEntity를 상속받은것들 입니다.
ResponseEntity는 사용자의 응답데이터를 포함하고 있어 응답을 만들 수 있습니다.
(예제코드)
/*
*/
@GetMapping("down_load/file")
public ResponseEntity<?> down_loadWdAgreeFile(HttpServletRequest request) throws Exception {
HashMap<String, Object> param = RequestUtil.paramToHashMap(request);
Result result = wdAgService.getWdAgApplyAttathFile(param);
String viewTf = StringUtil.fixNull(param.get("view"));
if(!ResultUtil.checkSuccess(result)) return Response(result);
String fileName = (String) JsonUtil.toHashMapObject(JsonUtil.toJson(result.getResultData())).get(CommCode.ATCH_FILENM);
byte[] file = Base64.getDecoder().decode(JsonUtil.toHashMapObject(JsonUtil.toJson(result.getResultData())).get(CommCode.ATCH_FILE).toString());
loggerService.insertOutLog(request, result);
HttpHeaders header = new HttpHeaders();
if("".equals(viewTf) || "F".equals(viewTf)) {
header.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+fileName);
} else if("T".equals(viewTf)) {
header.add(HttpHeaders.CONTENT_DISPOSITION, "inline; filename="+fileName);
}
header.add("Cache-Control", "no-cache, no-store, must-revalidate");
header.add("Pragma", "no-cache");
header.add("Expires", "0");
ByteArrayResource resource = new ByteArrayResource(file);
String ext = fileName.substring(fileName.indexOf(".") + 1);
if("pdf".equals(ext)) {
return ResponseEntity.ok()
.headers(header)
.contentLength(file.length)
.contentType(MediaType.parseMediaType("application/pdf"))
.body(resource);
} else if("jpg".equals(ext) || "jpeg".equals(ext)) {
return ResponseEntity.ok()
.headers(header)
.contentLength(file.length)
.contentType(MediaType.parseMediaType("image/jpeg"))
.body(resource);
} else {
return ResponseEntity.ok()
.headers(header)
.contentLength(file.length)
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(resource);
}
}
위의 코드는 ResponseEntity를 작성하는 예제코드입니다.
ResponseEntity를 메소드를 통해 작성하게 되면 Status -> Header -> Body순으로 자동으로 데이터가 작성됩니다.
1. status
return ResponseEntity.ok()
: ok()는 HttpStatus코드의 OK(200)를 응답데이터에 포함하고,
ResponseEntity의 BodyBuilder를 return합니다.
2. Header
HttpHeaders header = new HttpHeaders();
if("".equals(viewTf) || "F".equals(viewTf)) {
header.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+fileName);
} else if("T".equals(viewTf)) {
header.add(HttpHeaders.CONTENT_DISPOSITION, "inline; filename="+fileName);
}
header.add("Cache-Control", "no-cache, no-store, must-revalidate");
header.add("Pragma", "no-cache");
header.add("Expires", "0");
ByteArrayResource resource = new ByteArrayResource(file);
String ext = fileName.substring(fileName.indexOf(".") + 1);
if("pdf".equals(ext)) {
return ResponseEntity.ok()
.headers(header)
.contentLength(file.length)
.contentType(MediaType.parseMediaType("application/pdf"))
.body(resource);
}
CONTENT_DISPOSITION
: 응답하는 데이터를 어떻게 표시하는지를 알려주는 Header입니다.
기본값은 inline으로 설정되고 웹페이지에 표시하라는 의미입니다.
attachment를 사용한다면 사용자의 로컬에 다운로드할 수 있습니다.
추가적으로 filename은 이름에서 알 수 있듯 file의 이름을 알려주는 header입니다.
CONTENT_TYPE
: 응답하는 데이터의 type을 알려주는 header입니다. 오타를 줄이기 위해 MediaType의 상수를 사용했습니다.
CONTENT_LENGTH
: 응답데이터의 크기를 알려주는 header입니다.
3. Body
.body(resource);
: body() 메소드를 이용하여 body를 작성할 수 있으며, 매개변수로는 응답할 데이터를 담아주면 됩니다.
body()메소드를 사용하게되면 ResponseEntity가 생성됩니다.
참고 : galid1.tistory.com/565?category=783055
PostMan을 이용한 첨부파알업로드
포스트맨 형식: file은 form-data에 첨부파일 업로드해서 사용.
'[Web] > [Back-End]' 카테고리의 다른 글
웹(스프링) 첨부파일업로드 지식 (0) | 2021.01.05 |
---|---|
(Spring) 서버 로그 포맷 변경하는법 (0) | 2020.12.18 |
객체지향프로그램이란 (0) | 2020.12.15 |
HTTP, HTTPS / 대칭키, 비대칭키, CA (0) | 2020.12.15 |
Rest API (0) | 2020.12.15 |