파일 다운로드

Nux·2022년 7월 12일
0
post-custom-banner

🟣파일 다운로드

String fileName = "다운받을 시의 파일이름";
String saveFileName = "경로+실제 폴더에 저장된 파일 이름";
File file = new File(saveFileName);
long fileLength = file.length();

response.setHeader("Content-Disposition", "attachment; filename=\"" + 다운받는 사용자에게 보여질 파일명 + "\";");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Type", "application/download");
response.setHeader("Content-Length", "" + fileLength);
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");

try( FileInputStream fis = new FileInputStream(saveFileName);
	OutputStream out = response.getOutputStream(); ){
	int readCount = 0;
	byte[] buffer = new byte[1024];
	while((readCount = fis.read(buffer)) != -1){
	out.write(buffer,0,readCount);
	}
}catch(Exception ex){
    throw new RuntimeException("file Save Error");
}

🟣File file = new File(saveFileName);

  • File: 파일에 대한 경로나 참조를 추상화한 객체
  • 다양한 방법으로 파일객체 생성 가능
File file1 = new File(경로, 파일이름);

혹은

File file2 = new File(파일전체경로);

🟣long fileLength = file.length();

  • file.length(): 파일 길이(바이트)를 long타입으로 return

🟣String encodedFilename = "attachment; filename*=" + "UTF-8" + "''" + URLEncoder.encode(fileName, "UTF-8");

  • 한글이 깨지지 않도록 파일이름을 인코딩

🟣response.setHeader

  • 응답정보에 헤더를 추가

    헤더
    부가적인 정보를 전송할 수 있도록 해줌.
    서버에게 요청하거나 클라이언트에게 응답할 데이터가 담겨있음.

Content-Disposition

  • 사용자에게 보여줄 파일명 지정

Content-Transfer-Encoding

  • 전송되는 데이터의 인코딩 방식 지정

Content-Type

  • 파일 유형 설정
    • text/html, text/plain, image/gif 등

Content-Length

  • 파일 크기 지정

Pragma

  • 캐쉬된 페이지 사용 여부 설정
    • false로 설정 시, 캐시(저장된 페이지) 사용 없이 항상 최신 페이지를 출력

Expires

  • 만료일 지정
// 예시
1. response.setHeader("Expires", "Tue, 03 Jul 2001 06:00:00 GMT");
2. response.setHeader(“Expires”, 0);
3. long expiry = new Date().getTime() + cacheAge*1000; // 원하는 시간 지정
response.setHeader(“Expires”, expiry)

🟣try( FileInputStream fis = new FileInputStream(saveFileName); OutputStream out = response.getOutputStream(); )

  • Stream: 자바에서 외부의 데이터를 입/출력 시 사용하는 통로. byte단위만 읽을 수 있음
  • InputStream: 데이터를 입력 받을 때
  • OutputStream: 데이터를 출력 할 때

🟣byte[] buffer = new byte[1024];

  • 데이터를 옮길 단위 설정. 1024byte=1kb

🟣while((readCount = fis.read(buffer)) != -1)

  • 데이터 크기만큼 buffer를 돌리고 한번 순환 할 때마다 readCount를 ++
  • readCount!=-1: 읽어들일 스트림이 없을 때(스트림의 끝)까지 루프

🟣out.write(buffer,0,readCount);

  • buffer의 0부터 readCount까지 기록

🟢엑셀파일 다운로드

  • POI라이브러리로 생성한 엑셀 파일을 다운로드 하는 코드
XSSFWorkbook xssfWb = null; 
XSSFSheet xssfSheet = null; 
XSSFRow xssfRow = null; 
XSSFCell xssfCell = null;

try {
	
	...
	엑셀파일 작성부분 생략
	
    	String fileName = "직원목록_파일제목.xlsx";
   	String outputFileName = new String(fileName.getBytes("KSC5601"), "8859_1");
	response.setContentType("application/vnd.ms-excel");
	response.setHeader("Content-Disposition", "attachment; fileName=\"" + outputFileName + "\"");
	
	xssfWb.write(response.getOutputStream());
	xssfWb.close();

}catch(Exception e){ 
	e.printStackTrace();
}	
  • 초반부는 일반 파일 다운로드와 비슷하나, write를 outputStream이 아닌 XSSFWorkBook에 작성

참고
File객체: https://blog.naver.com/minis24/80097934711

파일다운로드: https://velog.io/@oyeon/%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EA%B5%AC%ED%98%84
https://hyeounstory.tistory.com/67

엑셀파일 다운로드:

post-custom-banner

0개의 댓글