Knowledge/Spring
스프링에서 파일다운로드 구현하는 방법
TakeKnowledge
2019. 9. 20. 08:13
반응형
일단 서버에 파일은 있고 데이터베이스에 파일 정보는 저장되어 있다고 가정한다
( 참고 : 스프링에서 컨트롤러로 넘어온 파일 저장하는 방법 - https://takeknowledge.tistory.com/61 )
사실 업로드를 잘 알고 있다면 다운로드도 쉽게 이해할 수 있다. outputStream과 inputStream의 역할만 바뀔 뿐 업로드와 크게 다르지 않기 때문이다. 넘어온 파일을 찾을 수 있는 파라미터로 파일 정보 찾고, 헤더에 정보 세팅하고, inputStream에서 outputStream으로 파일 정보 옮겨주면 끝! 바로 코드로 보자!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
@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");
}
}
|
참 쉽죠? 별거 없습니다!
참고
[LECTURE] 3) 파일 다운로드 구현하기 : edwith
들어가기 전에 이번 시간엔 Controller를 이용해 파일을 다운로드 하는 방법에 대해 알아보도록 하겠습니다. 학습 목표 파일을 다운로드 하는 컨트롤러를 작성할 수 있다. 핵심 ... - moons
www.edwith.org
반응형