一次文件下载记录

  一次不成熟的文件下载操作记录,希望能对需要的人有所帮助。

1.前端代码

$("#downloadModel").click(function(){
  var modelName = "设备信息导入模板.xls";
  window.location.href = commenUrl +"/importAndExport/downloadModel?modelName="+modelName;
});

2.控制层接收

1 @RequestMapping(value = "/downloadModel", method = RequestMethod.GET)
2 public void  downloadModel(HttpServletRequest request,HttpServletResponse response,String modelName) {
3     try {                
4         importAndExportService.downloadModel(modelName,request,response);
5     } catch (Exception e) {
6         e.printStackTrace();
7     }
8 }    

3.实现下载功能

  @SuppressWarnings("resource")
   @Override
   public void downloadBindModel(String modelName, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        //获取模板存放的路径
        String path=request.getSession().getServletContext().getRealPath("/")+"/excelTemplate/";
        InputStream is=new FileInputStream(new File(path + modelName));
        HSSFWorkbook hssfWorkbook=new HSSFWorkbook(is);
        //下载
        DownloadUtil dUtil=new DownloadUtil();
        ByteArrayOutputStream os=new ByteArrayOutputStream();
        hssfWorkbook.write(os);
        dUtil.download(os, response, modelName);
        os.flush();
        os.close();
        is.close();
    }

4.工具类代码

public class DownloadUtil{

  /**
   * @param filePath 要下载的文件路径
   * @param returnName 返回的文件名
   * @param response HttpServletResponse
   * @param delFlag 是否删除文件
   */
  protected void download(String filePath, String returnName, HttpServletResponse response, boolean delFlag){
    this.prototypeDownload(new File(filePath), returnName, response, delFlag);
  }


  /**
   * @param file 要下载的文件
   * @param returnName 返回的文件名
   * @param response HttpServletResponse
   * @param delFlag 是否删除文件
   */
  protected void download(File file,String returnName,HttpServletResponse response,boolean delFlag){
    this.prototypeDownload(file, returnName, response, delFlag);
  }

  /**
   * @param file 要下载的文件
   * @param returnName 返回的文件名
   * @param response HttpServletResponse
   * @param delFlag 是否删除文件
   */
  public void prototypeDownload(File file,String returnName,HttpServletResponse response,boolean delFlag){
    // 下载文件
    FileInputStream inputStream = null;
    ServletOutputStream outputStream = null;
    try {
      if(!file.exists()) {return;}
      response.reset();
      //设置响应类型    PDF文件为"application/pdf",WORD文件为:"application/msword", EXCEL文件为:"application/vnd.ms-excel"。
      response.setContentType("application/octet-stream;charset=utf-8");
      //设置响应的文件名称,并转换成中文编码
      //returnName = URLEncoder.encode(returnName,"UTF-8");
      returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1"));    //保存的文件名,必须和页面编码一致,否则乱码
      //attachment作为附件下载;inline客户端机器有安装匹配程序,则直接打开;注意改变配置,清除缓存,否则可能不能看到效果
      response.addHeader("Content-Disposition",   "attachment;filename="+returnName);
      //将文件读入响应流
      inputStream = new FileInputStream(file);
      outputStream = response.getOutputStream();
      int length = 1024;
      int readLength=0;
      byte buf[] = new byte[1024];
      readLength = inputStream.read(buf, 0, length);
      while (readLength != -1) {
        outputStream.write(buf, 0, readLength);
        readLength = inputStream.read(buf, 0, length);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        outputStream.flush();
      } catch (IOException e) {
        e.printStackTrace();
      }
      try {
        outputStream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
      try {
        inputStream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
      //删除原文件
      if(delFlag) {
        file.delete();
      }
    }
  }
  
  /**
   * @param byteArrayOutputStream 将文件内容写入ByteArrayOutputStream
   * @param response 写入response
   * @param returnName 返回的文件名
   * @throws IOException
   */
  public void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException {
    response.setContentType("application/octet-stream;charset=utf-8");
    returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1"));            //保存的文件名,必须和页面编码一致,否则乱码
    response.addHeader("Content-Disposition",   "attachment;filename=" + returnName);
    response.setContentLength(byteArrayOutputStream.size());

    ServletOutputStream outputstream = response.getOutputStream();    //取得输出流
    byteArrayOutputStream.writeTo(outputstream);                    //写到输出流
    byteArrayOutputStream.close();                                    //关闭
    outputstream.flush();                                            //刷数据
  }
}

 

posted on 2019-04-16 17:06  代码瞬间移动工程师  阅读(915)  评论(0编辑  收藏  举报