스프링12_ResponseBody, 파일3 다운로드

charl hi·2022년 1월 27일
1

Spring

목록 보기
13/25

@ResponseBody

	@GetMapping("test")
	@ResponseBody
//		ResponseBody 로 리턴값이 클라이언트에 직접 줄 때, 화면에 보여줌
//		+ @Controller == @RestController : 메소드가 아닌 클래스에
	public String test(HttpServletResponse response) throws IOException {
//		response.getWriter().write("zzzzzzzzzz");
		return "helloworld";
	}




파일 다운로드

GalleryController

//	파일 다운로드 방법1) response로 처리
	@GetMapping("down/{no}")
	@ResponseBody
	public void down(@PathVariable int no, HttpServletResponse response) throws IOException {
		
		//{no}에 맞는 파일 정보를 가져오기
		// Repository : db에 가서 no값으로 row 가져오기
		GalleryVo g = galleryRepository.getGallery(no);
		System.out.println(g);
		
		if(g == null) {
			//사용자가 없는 거 달라고 하면 에러
			response.sendError(400);
		}
		
		//파일 정보(g) 가져온 걸 바탕으로 클라이언트한테 파일 전송
		response.setHeader("Content-Type", "application/octet-stream");
		response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(g.getfName(), "UTF-8") + "\"");
		response.setHeader("Content-Length", String.valueOf(g.getfSize()));
		
		//파일전송
		
		//서버 컴퓨터의 파일을 가져옴
		File file = new File("D:\\uploadForSpring", String.valueOf(no));
		//그 파일을 바이트로 변환
		byte[] data = FileUtils.readFileToByteArray(file);
		
		//data를 클라이언트에게 보내기
		response.getOutputStream().write(data);
		
	}
    
//	파일 다운로드 방법2) 스프링에서 ResponseEntity로 처리
//	ResponseEntity == 응답 데이터 덩어리
	@GetMapping("down/{no}")
	public ResponseEntity down(@PathVariable int no) throws IOException {

		//2-1) {no}에 맞는 파일 정보를 가져오기
		// Repository : db에 가서 no값으로 row 가져오기
		GalleryVo g = galleryRepository.getGallery(no);
		System.out.println(g);

		if(g == null) {
			//파일 없을 때 == 사용자가 없는 거 달라고 하면 에러
			return ResponseEntity.notFound().build();	//빌드패턴
		}
		
		//파일 있을 때
		//2-2) 파일 전송
		//파일 가져오기(서버 컴퓨터)
		File file = new File("D:\\uploadForSpring", String.valueOf(no));
		//파일을 바이트로 변환
		byte[] data = FileUtils.readFileToByteArray(file);
		
		//스프링이 원하는 타입인 ByteArrayResource 타입으로 맞추기
		ByteArrayResource res = new ByteArrayResource(data);
		
		//res(바이트 덩어리)를 ResponseEntity에 담아서 클라이언트에게 보내기
		return ResponseEntity
					.ok()
					.contentType(MediaType.APPLICATION_OCTET_STREAM)
					.contentLength(g.getfSize())
					.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + URLEncoder.encode(g.getfName(), "UTF-8") + "\"")
					.header(HttpHeaders.CONTENT_ENCODING, "UTF-8")
					.body(res);
	}
	
	



GalleryVo를 바탕으로 파일 전송

방법1) HttpServletResponse response로 처리

//header
		response.setHeader("Content-Type", "application/octet-stream");
		response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(파일이름, "UTF-8") + "\"");
		response.setHeader("Content-Length", String.valueOf(파일사이즈));

//바이트로 변환
		//서버 컴퓨터의 파일을 가져옴
		File file = new File("D:\\uploadForSpring", String.valueOf(no));
		//그 파일을 바이트로 변환
		byte[] data = FileUtils.readFileToByteArray(file);
		
		//data를 클라이언트에게 보내기
		response.getOutputStream().write(data);


방법2) 스프링에서 ResponseEntity로 처리

		//스프링이 원하는 타입인 ByteArrayResource 타입으로 맞추기
		ByteArrayResource res = new ByteArrayResource(data);
		
		//res(바이트 덩어리)를 ResponseEntity에 담아서 클라이언트에게 보내기
		return ResponseEntity
					.ok()
					.contentType(MediaType.APPLICATION_OCTET_STREAM)
					.contentLength(g.getfSize())
					.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + URLEncoder.encode(g.getfName(), "UTF-8") + "\"")
					.header(HttpHeaders.CONTENT_ENCODING, "UTF-8")
					.body(res);




0개의 댓글