-
스프링에서 파일다운로드 구현하는 방법Knowledge/Spring 2019. 9. 20. 08:13반응형
일단 서버에 파일은 있고 데이터베이스에 파일 정보는 저장되어 있다고 가정한다
( 참고 : 스프링에서 컨트롤러로 넘어온 파일 저장하는 방법 - https://takeknowledge.tistory.com/61 )
사실 업로드를 잘 알고 있다면 다운로드도 쉽게 이해할 수 있다. outputStream과 inputStream의 역할만 바뀔 뿐 업로드와 크게 다르지 않기 때문이다. 넘어온 파일을 찾을 수 있는 파라미터로 파일 정보 찾고, 헤더에 정보 세팅하고, inputStream에서 outputStream으로 파일 정보 옮겨주면 끝! 바로 코드로 보자!
12345678910111213141516171819202122232425262728293031323334353637383940414243444546@GetMapping(path = "/download/{id}")public void fileDownload(@PathVariable(name = "id") Integer fileId, HttpServletResponse response) {FileInfo fileInfo = fileService.getFileInfo(fileId);// 파일 정보를 가지고 온다 ( 여기서 FileInfo는 스프링에 있는 자료형이 아니고 제가 만든 DTO 입니다 )String fileName = fileInfo.getFileName();// 파일 이름 가지고 오고String tempfileName = fileInfo.getSaveFileName();// 폴더까지 지정되어 있는 파일명 가져와서StringBuilder sb = new StringBuilder("c:/tmp/");sb.append(tempfileName);// 파일 저장되어 있는 경로뒤에 붙여줘서String saveFileName = sb.toString();// saveFileName을 만든다.String contentType = fileInfo.getContentType();// contentType 가져오고File file = new File(saveFileName);long fileLength = file.length();// 데이터베이스에 없는 정보는 파일로 만들어서 가져온다. 이 경우엔 Content-Length 가져온 것response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");response.setHeader("Content-Transfer-Encoding", "binary");response.setHeader("Content-Type", contentType);response.setHeader("Content-Length", "" + fileLength);response.setHeader("Pragma", "no-cache;");response.setHeader("Expires", "-1;");// 그 정보들을 가지고 reponse의 Header에 세팅한 후try (FileInputStream fis = new FileInputStream(saveFileName); OutputStream out = response.getOutputStream();) {// saveFileName을 파라미터로 넣어 inputStream 객체를 만들고// response에서 파일을 내보낼 OutputStream을 가져와서int readCount = 0;byte[] buffer = new byte[1024];// 파일 읽을 만큼 크기의 buffer를 생성한 후while ((readCount = fis.read(buffer)) != -1) {out.write(buffer, 0, readCount);// outputStream에 씌워준다}} catch (Exception ex) {throw new RuntimeException("file Load Error");}}참 쉽죠? 별거 없습니다!
참고
반응형'Knowledge > Spring' 카테고리의 다른 글
유저가 업로드 한 이미지 파일 로컬에서 가져와 사용하는 방법! (2) 2019.09.20 스프링에서 컨트롤러로 넘어온 파일 저장하는 방법 (0) 2019.09.18 스프링에서 로그를 남겨보자! SLF4J와 Logback (0) 2019.09.18 로그인 기능은 어떻게 구현할까? 세션에 대해 알아보자 (0) 2019.09.04 스프링 controller에서 파라미터를 받는 다양한 방법 ( @RequestParam, @RequestBody, @PathVariable) (0) 2019.09.04