前端接收二进制文件流,通过blob对象实现下载

本文介绍了一种在前端处理后端返回的二进制流并实现文件下载的方法。通过设置HTTP请求的responseType为'blob',后端返回的数据可以被解析成Blob对象,再利用HTML5的a标签或IE10+的navigator.msSaveBlob方法实现不同浏览器下的文件下载。

实现表格导出功能时,后端接口返回一堆看不懂的乱码,第一反应是不是接口出错了,其实不是,后端直接返回了一个二进制流,前端需要通过blob对象来实现文件下载功能。

后端返回结果如下:

在这里插入图片描述
代码如下:

let param = {};
this.$http.post("/api/xxx/xxx/xxx",{
    timeout:0,
    params:param,
    responseType:'blob'
}).then( res =>{
   const content = res.data
   const blob = new Blob([content])
   const fileName = new Date()+'导出文件'
   if ('download' in document.createElement('a')) {
      // 非IE下载
      const elink = document.createElement('a')
      elink.download = fileName  //命名下载名称
      elink.style.display = 'none'
      elink.href = URL.createObjectURL(blob) //表示一个指定的file对象或Blob对象
      document.body.appendChild(elink)
      elink.click()  //点击触发下载
      URL.revokeObjectURL(elink.href) // 释放URL 对象
      document.body.removeChild(elink)
  } else { 
      // IE10+下载
      navigator.msSaveBlob(blob, fileName)
 }
})
### 前端接收并处理二进制文件前端开发中,当需要接收来自后端的二进制文件时,通常通过 HTTP 请求工具(如 Axios)来获取数据,并根据实际需求对其进行进一步处理。以下是具体的操作程以及注意事项。 #### 1. 设置请求头以接收二进制数据 为了正确接收二进制文件,在发起请求前需显式声明响应类型为 `blob` 或 `arraybuffer`。这一步骤非常重要,因为默认情况下,Axios 和其他类似的库会尝试将接收到的内容解析为 JSON 字符串或其他文本形式[^1]。 ```javascript axios({ url: 'https://example.com/api/file', method: 'GET', responseType: 'blob', // 明确告知服务端返回的是二进制大对象(BLOB) }).then((response) => { handleBinaryData(response.data); }); ``` 此处设置了 `responseType: 'blob'` 参数,意味着无论服务器发送什么类型的资源——无论是图片、文档还是视频片段等多媒体资料,都会被当作一块未加工过的字节序列对待。 #### 2. 处理接收到的 BLOB 数据 一旦成功捕获到了目标文件的原始比特表示形式之后,就可以依据业务逻辑采取不同的行动方案了。例如直接嵌入页面显示媒体内容或者触发浏览器自动下载机制等等[^2]。 ##### A. 自动触发文件下载行为 如果目的是让用户能够方便快捷地保存远程存储上的某些重要档案副本至本地磁盘当中,则可通过创建临时超链接节点的方式轻松达成目的: ```javascript function downloadBlobAsFile(blobContent, suggestedFileName='defaultName.ext') { const blobInstance = new Blob([blobContent], {type : 'application/octet-stream'}); const anchorElement = document.createElement('a'); if(window.navigator.msSaveOrOpenBlob){ // IE/Edge 特定语法 navigator.msSaveBlob(blobInstance ,suggestedFileName ); } else{ const objectUrlForDownload = URL.createObjectURL(blobInstance); anchorElement.href=objectUrlForDownload ; anchorElement.download=suggestedFileName ; document.body.appendChild(anchorElement); anchorElement.click(); document.body.removeChild(anchorElement); setTimeout(() =>{URL.revokeObjectURL(objectUrlForDownload );},0);// 清理内存泄漏风险 } } ``` 上述代码片段展示了如何跨主现代浏览器安全有效地实施这一功能[^2]。 ##### B. 动态加载在线预览素材 除了单纯提供离线拷贝选项之外,有时我们也希望能够即时渲染这些外部资产供访问者浏览体验。针对这种情况下的解决方案取决于具体的 MIME 类型分类标准: - 对于图像类别的实例可以直接赋值给 `<img>` 标签 src 属性; - 如果涉及音频或视屏播放则分别关联对应的 HTML5 Media Elements (`<audio>`, `<video>`); - 至于 Office 文档之类的复杂情况可能还需要借助第三方插件才能实现无缝集成效果[^3]。 ```html <!-- 图片示例 --> <img id="previewImage"/> <script> var imgTag=document.getElementById("previewImage"); imgTag.src=window.URL.createObjectURL(new Blob(["..."],{"type":"image/png"})); </script> <!-- 视频示例 --> <video controls autoplay width="640" height="360"> <source id="vidSource"/> Your browser does not support the video tag. </video> <script> document.querySelector("#vidSource").src= window.URL.createObjectURL( new Blob(["..."],["type":"video/mp4"]) ); </script> ``` 以上仅列举了几种常见情形下的应用示范而已,实际上还有更多可能性等待探索发现! --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值