반응형
Spring Boot를 사용하면서 파일 다운로드는 많이 구현해 봤지만 zip으로 압축 후 다운받는 프로세스는 구현은 해보지 않아 이번에 정리해 보려고 한다.
개발환경
- JDK 11
- Spring Boot 2.6.7
CommonController.java
- CrossOrigin는 현재 view를 nuxt.js로 개발하고 있어 CORS문제가 발생하기 때문에 테스트 환경에서 예외처리해주기위서 사용한 어노테이션이다.
- 2개의 메서드가 있는데 fileDownload는 단일 파일 다운로드에 대한 기능이고 zipFileDownload는 다중 파일을 zip으로 압축 후 다운받는 기능이다.
@CrossOrigin(origins = "http://127.0.0.1:3000") // 추가
@RestController
public class CommonController {
//파일 다운로드
@RequestMapping(value="fileDownload.do")
public void fileDownload(HttpServletResponse response) throws IOException {
File file = new File("C:/Users/lth11/Desktop/이태희2021.06.28~/KALIS/fileTest/test1.txt");
fileDownload(response, file);
}
//zip 변환 후 파일 다운로드
@RequestMapping(value="zipFileDownload.do")
public void zipFileDownload(HttpServletResponse response) throws IOException {
List<File> fileList = new LinkedList();
fileList.add(new File("C:/Users/lth11/Desktop/이태희2021.06.28~/KALIS/fileTest/test1.txt"));
fileList.add(new File("C:/Users/lth11/Desktop/이태희2021.06.28~/KALIS/fileTest/test2.txt"));
fileList.add(new File("C:/Users/lth11/Desktop/이태희2021.06.28~/KALIS/fileTest/apple.jpg"));
zipFileDownload(response, fileList, "zipFile");
}
//파일 다운로드
public void fileDownload(HttpServletResponse response, File file) throws IOException {
FileInputStream fis = null;
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/file");
response.addHeader("Content-Disposition", "attachment; filename=" + file.getName());
fis = new FileInputStream(file);
StreamUtils.copy(fis, response.getOutputStream());
fis.close();
}
//zip 변환 후 파일 다운로드
public void zipFileDownload(HttpServletResponse response, List<File> fileList, String zipName) throws IOException {
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/zip");
response.addHeader("Content-Disposition", "attachment; filename=\"" + zipName + ".zip\"");
ZipOutputStream zipOut = null;
FileInputStream fis = null;
zipOut = new ZipOutputStream(response.getOutputStream());
// 루프를 돌며 ZipOutputStream에 파일들을 계속 주입해준다.
for(File file : fileList) {
zipOut.putNextEntry(new ZipEntry(file.getName()));
fis = new FileInputStream(file);
StreamUtils.copy(fis, zipOut);
fis.close();
zipOut.closeEntry();
}
zipOut.close();
}
}
반응형
'Java' 카테고리의 다른 글
[JAVA] 파일 다운 시 한글 이름 깨짐 현상 (0) | 2023.01.05 |
---|---|
[JAVA] Spring Annotation @MapperScan이란? (0) | 2022.08.17 |
[JAVA] Primitive type(기본 타입) VS Reference type(참조 타입) (0) | 2022.04.11 |
[JAVA] @ReqeustBody와 @ResponseBody 란? (0) | 2022.02.12 |
[JAVA] DTO vs VO (0) | 2022.02.10 |