浏览器文件下载问题

情况简介

后台

java开发的http 下载接口
1. 将文件内容写入 response.getOutputStream();
2. response.setContentType 设置文件类型
3. response.addHeader(“Content-Disposition”, “attachment;filename=文件名”)

前端 浏览器有3种下载方法

  1. window.open(url)
  2. form 表单post请求
  3. axios请求 + a标签

错误场景

docx文件大小6M
前端用的是a标签下载方法。用火狐浏览器,postman测试都成功

  • 用谷歌浏览器下载时
    1. 请求状态200,
    2. 头信息返回正常
    3. body:failed to load reponse data
    4. 显示:下载失败-网络错误

先说结论

  1. a标签下载有长度限制,不能超过浏览器URL长度限制(尤其是谷歌和ie,限制很小)

  2. 大文件下载用window.open(url)

解决方案原理汇总

  1. 高版本的chrome对字节流的下载进行了限制,需在头信息中声明字节流长度
    • 解决方案
      增加头信息Content-Length

百度大多都是这个原因,可惜我的不是

  1. 前端用a标签下载,文件过大

a标签下载原理

a标签设置download 属性,下载url中的内容

  • 原理步骤
    1. 用ajax发一次请求,收到返回body里的文件流
    2. 创建一个a标签, download = 自定义文件名, href = 文件流内容
    3. 点击a标签触发下载
<a href="url" download="filename"></a>
//发送http请求 返回res
send(params).then(res => {
  if(res.data){ // res.data为后台返回的数据
    //创建一个a标签
    let a = document.createElement('a');

    //解码,得文件名
    const filename = decodeURI(res.headers['content-disposition'].split(';')[1]).replace('filename=','');
    // a.download 指定下载的文件名
    a.download = filename; 

    //指定文件MIME 
    let blob = new Blob([res.data],{type: "application/vnd.ms-excel"}); 
    // a.href URL对象
    a.href = URL.createObjectURL(blob); 
    
    // 模拟点击
    a.click(); 
    
    // 释放URL 对象
    URL.revokeObjectURL(a.href); 
  }

浏览器下载规则(精华)

  1. 浏览器请求内容时,返回能展示就会直接展示(html,图片),
    不能展示则 触发下载操作,弹出下载框
  2. 用Ajax请求,浏览器不会识别这是在进行下载操作,不会有弹出保存路径框。
  3. 各个浏览器对URL长度限制不同导致的;于是收集了各个浏览器的限制标准
    IE 最大长度限制为2048字节
    Chrome 最大长度限制为8182字节
    Firefox 最大长度限制为65536字节
    Safari 最大长度限制为80000字节
    Opera 最大长度限制为190000字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyc1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值