-
JAVA | 파일 다운로드 구현하기▼ Backend/자바 (JAVA) 2021. 9. 30. 15:34반응형
▶ JAVA 파일 다운로드
파일명을 파라미터로 받아 다운로드하는 간단한 파일 다운로드 예제입니다.
여기서 확장하여 파일 최대사이즈, 확장자, 경로등에 대해 프로퍼티에서 관리, 파일 데이터를 데이터베이스로 관리하여 구현할 수 있습니다.FileController
package com.boot.common.web; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/file") public class FileController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @GetMapping("/download") public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws Exception { try { // fileName 파라미터로 파일명을 가져온다. String fileName = request.getParameter("fileName"); // 파일이 실제 업로드 되어있는(파일이 존재하는) 경로를 지정한다. String filePath = "C:\\Users\\apple\\Downloads\\"; // 경로와 파일명으로 파일 객체를 생성한다. File dFile = new File(filePath, fileName); // 파일 길이를 가져온다. int fSize = (int) dFile.length(); // 파일이 존재 if (fSize > 0) { // 파일명을 URLEncoder 하여 attachment, Content-Disposition Header로 설정 String encodedFilename = "attachment; filename*=" + "UTF-8" + "''" + URLEncoder.encode(fileName, "UTF-8"); // ContentType 설정 response.setContentType("application/octet-stream; charset=utf-8"); // Header 설정 response.setHeader("Content-Disposition", encodedFilename); // ContentLength 설정 response.setContentLengthLong(fSize); BufferedInputStream in = null; BufferedOutputStream out = null; /* BufferedInputStream * java.io의 가장 기본 파일 입출력 클래스 입력 스트림(통로)을 생성해줌 사용법은 간단하지만, 버퍼를 사용하지 않기 때문에 느림 속도 문제를 해결하기 위해 버퍼를 사용하는 다른 클래스와 같이 쓰는 경우가 많음 */ in = new BufferedInputStream(new FileInputStream(dFile)); /* BufferedOutputStream * java.io의 가장 기본이 되는 파일 입출력 클래스 출력 스트림(통로)을 생성해줌 사용법은 간단하지만, 버퍼를 사용하지 않기 때문에 느림 속도 문제를 해결하기 위해 버퍼를 사용하는 다른 클래스와 같이 쓰는 경우가 많음 */ out = new BufferedOutputStream(response.getOutputStream()); try { byte[] buffer = new byte[4096]; int bytesRead = 0; /* 모두 현재 파일 포인터 위치를 기준으로 함 (파일 포인터 앞의 내용은 없는 것처럼 작동) int read() : 1byte씩 내용을 읽어 정수로 반환 int read(byte[] b) : 파일 내용을 한번에 모두 읽어서 배열에 저장 int read(byte[] b. int off, int len) : 'len'길이만큼만 읽어서 배열의 'off'번째 위치부터 저장 */ while ((bytesRead = in .read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } // 버퍼에 남은 내용이 있다면, 모두 파일에 출력 out.flush(); } finally { /* 현재 열려 in,out 스트림을 닫음 메모리 누수를 방지하고 다른 곳에서 리소스 사용이 가능하게 만듬 */ in.close(); out.close(); } } else { throw new FileNotFoundException("파일이 없습니다."); } } catch (Exception e) { logger.info(e.getMessage()); } } }
호출 URL
- /file/download?fileName=파일명
소스 다운로드
반응형'▼ Backend > 자바 (JAVA)' 카테고리의 다른 글
JAVA | try-with-resource, 자원을 자동으로 해제 (0) 2021.12.13 JAVA | JVM(Java Virtual Machine) 이란 (0) 2021.12.10 JAVA | 파일 업로드 구현하기 (0) 2021.09.29 JAVA | 비밀번호의 암호화 (SHA, SALT) (0) 2021.08.19 JAVA | 개발 시 점검해야 할 항목 및 성능개선을 위한 (0) 2021.06.30