본문 바로가기
개발자/자바 & 스프링

자바 스프링 파일 다운로드 / 이미지 다운로드

by mansfield 2023. 2. 15.
반응형

 

파일 DTO

import lombok.Data;

@Data
public class ServiceFileDTO {
	
	private int file_no;
	private int service_num;
	private String file_name;
	private String file_path;
	
}

 

파일 다운로드 컨트롤러 코드

@RequestMapping("fileDownload.do")
	public void fileDownload(HttpServletRequest request, HttpServletResponse response,
			@RequestParam("no") int fileNo) throws IOException {
		
		//파일 이름과 파일 패스가 필요해서 가져옴 
		ServiceFileDTO fileDTO = this.dao.getOneUserFileToAdmin(fileNo);
		System.out.println("fileDTO = " + fileDTO);
		
		//파일과 현재 서블릿 연결
		//String root = request.getSession().getServletContext().getRealPath("/"); ///webapp
        	//root는 이미지(파일)이 실제로 저장되어있는 폴더의 경로를 적어줌. 
       		//폴더 우클릭 > properties에 경로 나옴
		String root = "C:\\Users\\package\\src\\main\\webapp\\resources\\image_service\\upload\\";
		String downLoadFile = root + fileDTO.getFile_path();
		System.out.println(fileDTO.getFile_path());
		
		//파일을 읽어오기 위한 스트림
		FileInputStream fis = new FileInputStream(downLoadFile);
		//속도를 빠르게 하기 위해 보조스트림 생성
		BufferedInputStream bis = new BufferedInputStream(fis);
		
		
		//읽어온 파일을 사용자에게 전달할 스트림 생성
		ServletOutputStream sos = response.getOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(sos);
		
		//파일명 처리 - 사용자가 받을 파일 : 크롬에서 파일명이 정상적으로 받아지게 처리해주는 것
		String resFilename = new String(fileDTO.getFile_name().getBytes("UTF-8"), "ISO-8859-1");
		
		//파일 다운로드를 위한 HTTP Header 설정
		response.setContentType("application/octet-stream");  //파일의 형식으로 받아라 > 응답나가는 데이터 타입
		response.setHeader("Content-Disposition", "attachment;filename="+resFilename); //파일의 이름 알려줌
		
		//파일전송
		while(true) {
        	//bis => 파일과 서블릿 연결 , bos => 서블릿과 사용자(브라우저, 클라이언트)와 연결되어있음
			int read = bis.read(); //read() : 데이터가 없으면 -1을 반환함, input스트림으로 읽어옴
			if(read != -1) {
				bos.write(read);	//데이터가 있으면 클라이언트한테 내보냄
			}else {
				break;
			}
		}
		
		bos.close();
		bis.close();
	}

ServiceDAO 인터페이스 

package com.service.model;

import java.util.ArrayList;
import java.util.List;

public interface ServiceDAO {
	
	public ServiceFileDTO getOneUserFileToAdmin(int num);

ServiceDAO 인터페이스를 implements 받음

@Override
	public ServiceFileDTO getOneUserFileToAdmin(int num) {
		// TODO Auto-generated method stub
		return this.sqlSession.selectOne("getOneFile", num);
	}

mybatis 쿼리

<!-- 반환형 객체 -->
	<select id="getOneFile" parameterType="int" resultType="com.service.model.ServiceFileDTO">
		select * from service_file_trip where file_no = #{num }
	</select>

 

300x250

댓글