요르딩딩

스프링 첨부파일다운로드 (반환타입 :ResponseEntity) 본문

[Web]/[Back-End]

스프링 첨부파일다운로드 (반환타입 :ResponseEntity)

요르딩딩 2020. 12. 17. 17:45
728x90
반응형

내가 사용한 로직은 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

 

SpringMVC - 핸들러 메소드 - 8 (파일 다운로드 기능 구현, 리턴타입 : ResponseEntity)

SpringMVC - 핸들러 메소드 - 8 (파일 다운로드 리턴타입 ResponseEntity) 이번시간에는 Handler에서 file download를 제공하는 방법을 알아보도록 하겠습니다. 1. ResponseEntity 1.1 ResponseEntity 란? Spring..

galid1.tistory.com

 

 

PostMan을 이용한 첨부파알업로드

 

포스트맨 형식:  file은 form-data에 첨부파일 업로드해서 사용.

728x90
반응형

'[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
Comments