文件下载

公司经常会用到让用户下载文档并上传,这里提供一个下载表格的功能。

1.将文件添加到项目中,比如新建包 com.xx.xx.web.exceltpl,添加表格文件。

  该文件放在项目中,会在启动的时候加载到项目的编译空间中

2使用Thread.currentThread().getContextClassLoader().getResource("/").getPath()获取当前项目的编译路径

    @RequestMapping(value = "downloadTemplate", produces = {"text/javascript;charset=UTF-8"})
    public void downloadTemplate(HttpServletResponse response,HttpServletRequest request){
        //获得当前项目的编译路径
        String classpath=Thread.currentThread().getContextClassLoader().getResource("/").getPath();
        //获得文件路径eg:DEFAULT_ORG_EXCEL_TPL_PATH:/com/xx/xx/web/exceltpl/org_tpl.xls
        File file = new  File(classpath+Constants.DEFAULT_ORG_EXCEL_TPL_PATH);
        //Constants.DEFAULT_ORG_EXCEL_TPL_NAME:学校组织机构模板.xls
        FileUtils.download(file, Constants.DEFAULT_ORG_EXCEL_TPL_NAME, request, response);
    }
/**
     * 
     * 名称:download<br/>
     * 描述:文件下载 <br/>
     * 
     * @param file
     *            包含文件完整路径的File对象 ,例如new File("c:/yunlu/sch/123456/a.xls")
     * @param fileName
     *            下载后的文件名
     * @param request
     * @param response
     * @return response
     */
    public static HttpServletResponse download(File file, String fileName,
            HttpServletRequest request, HttpServletResponse response) {
        try {
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(file));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename="
                    + new String(fileName.getBytes("GBK"), "ISO-8859-1"));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(
                    response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            file.delete();
            ex.printStackTrace();
        }
        return response;
    }