본문 바로가기

프로그래밍/Spring

[SpringMVC] - 파일 다운로드



Spring MVC - 파일 다운로드



필자는 간단하게 2번 사용




context.xml 설정


파일 다운로드를 위하여 context.xml에 추가


	
	
    
	



Util 설정


방법 1 : 경로를 저장한 경우

@Component
public class FileDownloadView extends AbstractView{
		
	public void Download(){ setContentType("application/download; utf-8"); }
	
	@Override
	protected void renderMergedOutputModel(Map model,HttpServletRequest request, HttpServletResponse response)throws Exception {

		setContentType("application/download; utf-8");

		File file = (File) model.get("downloadFile");

		response.setContentType(getContentType());
		response.setContentLength((int) file.length());

		String header = request.getHeader("User-Agent");
		boolean b = header.indexOf("MSIE") > -1;
		String fileName = null;

		if (b) {
			fileName = URLEncoder.encode(file.getName(),"UTF-8");
		} else {
			fileName = new String(file.getName().getBytes("UTF-8"),"iso-8859-1");
		}

		response.setHeader("Conent-Disposition", "attachment); filename=\"" + fileName + "\";");
		response.setHeader("Content-Transter-Encoding", "binary");

		OutputStream out = response.getOutputStream();
		FileInputStream fis = null;

		try {
			fis = new FileInputStream(file);
			FileCopyUtils.copy(fis, out);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException ioe) {
					ioe.printStackTrace();
				}
			}
			out.flush();
		}
	}
}
@Controller
public class FileDownloadController {
	
	// 파일 다운로드 하는 메소드
	@RequestMapping(value = "/rsbm/fileDownload.do", method = RequestMethod.GET)
	// get 방식 하이퍼링크 경로로 보낸 PK 값을 인자로 받음
	public ModelAndView reDocumentDown1(@RequestParam(value = "noticeNum") String noticeNum, HttpServletRequest request) throws Exception {
		// pk 값으로 해당 도메인 객체의 파일 전체 경로 값을 받은 후
		NoticeVO noticeVO = noticeService.readByCode(noticeNum);
		String filePath = request.getSession().getServletContext().getRealPath("경로");
		// 전체 경로를 인자로 넣어 파일 객체를 생성
		File downFile = new File(noticeVO.getAttachFile1());
		File downloadFile = new File(filePath + noticeVO.getAttachFile1());

		// 생성된 객체 파일과 view들을 인자로 넣어 새 ModelAndView 객체를 생성하며 파일을 다운로드
		// (자동 rendering 해줌)
		return new ModelAndView("fileDownloadView", "downloadFile", downloadFile);
	}
}


방법 2

@Controller
public class FileDownload {
	
	 /**
     * 파일(첨부파일, 이미지등) 다운로드.(업체견적서)
	 * @throws UnsupportedEncodingException 
     */
    @RequestMapping(value = "fileDownload.do")
    public void fileDownload4(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
        String path =  request.getSession().getServletContext().getRealPath("저장경로");
       
        String filename = request.getParameter("fileName");
        String downname = request.getParameter("downName");
        String realPath = "";
        System.out.println("downname: "+downname);
        if (filename == null || "".equals(filename)) {
            filename = downname;
        }
        
        try {
        	String browser = request.getHeader("User-Agent"); 
            //파일 인코딩 
    		if (browser.contains("MSIE") || browser.contains("Trident")
    				|| browser.contains("Chrome")) {
    			filename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+",
    					"%20");
    		} else {
    			filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
    		}
        } catch (UnsupportedEncodingException ex) {
            System.out.println("UnsupportedEncodingException");
        }
        realPath = path +"/" +downname.substring(0,4) + "/"+downname;
        System.out.println(realPath);
        File file1 = new File(realPath);
        if (!file1.exists()) {
            return ;
        }
        
        // 파일명 지정        
		response.setContentType("application/octer-stream");
		response.setHeader("Content-Transfer-Encoding", "binary;");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
        try {
            OutputStream os = response.getOutputStream();
            FileInputStream fis = new FileInputStream(realPath);

            int ncount = 0;
            byte[] bytes = new byte[512];

            while ((ncount = fis.read(bytes)) != -1 ) {
                os.write(bytes, 0, ncount);
            }
            fis.close();
            os.close();
        } catch (FileNotFoundException ex) {
            System.out.println("FileNotFoundException");
        } catch (IOException ex) {
            System.out.println("IOException");
        }
    }


JSP 다운로드 링크


					
					
					${fileview.fileName}
					${fileview.size2String()}