利用输入输出流下载

1、需求很简单,就是根据文件路径进行文件下载,但是实际完成时遇到了一些问题(项目的前端是用layUI框架)

最开始使用ajxs发送请求到后台进行下载,但是每次都会下载失败,最开始以为是后台代码写的有问题,但是后来发现,各路大神使用的代码基本没有太大区别,后来意识到有可能是前端的请求出现了问题,经过一些列排查发现,是ajxs发送请求后,文件未下载完成页面就刷新,导致下载失败,问题找到了就好解决了

这是项目页面我页面

我给下载按键进行监听,然后使用window.location.href直接向后台发送请求,这样页面不会刷新

  //监听头工具栏事件 监听
      table.on('tool(referenceList)', function(obj){ 
          var data = obj.data;
         if(obj.event==='downloads'){
             window.location.href="${ctx}appUser/downloadFile.html?fileName="+obj.data.fileDownload; //   fileName是文件路径,直接传到后台
            }
          })

然后后台,直接将文件路径付给下面流

    @RequestMapping("downloadFile") 
    public void downloadModel(Model model,HttpServletRequest request,HttpServletResponse response,String fileName ) {
        try{
               response.reset();
                fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1"); // 下载的文件名显示编码处理
                response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName+"\"");
               response.setContentType("application/octet-stream;charset=utf-8");
               BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));
               BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
               byte[] buffer = new byte[1024];
               int readlength = 0;
               while((readlength = bis.read(buffer)) != -1){
                bos.write(buffer,0,readlength); 
               }
               bis.close();
               bos.close();
              }catch(Exception e){
               e.printStackTrace();
              }        
    }

这样问题就轻松解决了(然而事实并不是这样,解决好久)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值