Spring File Download 구현




Spring Framework 에서 File download 를 쉽게 구현이 가능합니다.

전체적인 로직은 파일 다운로드 URL 요청 시 해당 파일을 찾아 JSP 페이지가 아닌 Class 로 구현된 View 로 연결하여 Stream으로 요청한 Client 쪽으로 전달합니다.



1. dispatcher-servlet.xml 파일에 bean 등록

<bean id="fileDownloadView" class="com.util.FileDownloadView"/>
<bean id="fileViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
    <property name="order" value="0"/>
</bean>
cs




2. view 역활을 대신 할 class를 생성

public class FileDownloadView extends AbstractView{
    
    public FileDownloadView(){
        //content type을 지정. 
        setContentType("apllication/download; charset=utf-8");
    }
        
    @Override
    protected void renderMergedOutputModel(Map<String, Object> model,
            HttpServletRequest req, HttpServletResponse res) throws Exception {
        // TODO Auto-generated method stub
        
        
        File file = (File) model.get("downloadFile");
        
        res.setContentType(getContentType());
        res.setContentLength((int) file.length());
        res.setHeader("Content-Disposition""attachment; filename=\"" + 
                java.net.URLEncoder.encode(file.getName(), "utf-8"+ "\";");
        res.setHeader("Content-Transfer-Encoding""binary");
        
        OutputStream out = res.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 e) {
                    e.printStackTrace();
                }
            }
        }
        
        out.flush();
    }
}
cs





3. 파일 다운로드 요청 URL에서 생성한 View로 전달합니다.

@RequestMapping(value = "/call/callDownload.do")
public ModelAndView callDownload(@RequestParam (value="fileFullPath"String fileFullPath, 
            HttpServletRequest request, 
            HttpServletResponse response) throws Exception {
        
    LOGGER.debug("callDownload : "+ fileFullPath);
        
    File downloadFile = new File(fileFullPath);
        
    if(!downloadFile.canRead()){
        throw new Exception("File can't read(파일을 찾을 수 없습니다)");
    }
        
    return new ModelAndView("fileDownloadView""downloadFile",downloadFile);
}
cs

Share this

Related Posts

Previous
Next Post »