前端下载字节流

前端处理Blob字节流实现下载
这篇博客探讨了如何处理后端返回的Blob形式的字节流进行前端下载。主要内容包括前端设置Content-Type为multipart/form-data和responseType为blob的HTTP请求,使用Vue框架,封装一个通用的downloadBytes方法,将数据转换为blob并利用a标签实现文件下载。通过引入该方法,可以方便地下载后端提供的任意文件。

后端返回以blob形式的二进制字节流,前端请求时,header中需设置以下2个属性:

1.Content-Type:multipart/form-data

2.responseType:blob

前端使用Vue,代码如下

export function downloadCert(baseId){
  return request({
    url: `/certificate/${baseId}`,
    isBus: true,
    responseType: 'blob',
    contentType: 'multipart/form-data'
  });
}

 

 

设置以后,请求中会携带相关参数,请求为post

 

 封装一个通用的下载方法 (downloadBytes)

将后端返回的数据转为blob对象,创建a标签,将a标签url指向blob对象,触发a标签点击事件

/**
 * 下载后端返回的字节流文件
 * @param {字节流} res 
 * @param {文件名} fileName 
 */
export function downloadBytes(res, fileName){
  const blob = new Blob([res]);
  const url = URL.createObjectURL(blob);
  aLinkDownload(url, fileName);
}


/** a标签下载 */
export function aLinkDownload(url, fileName){
  const aLink = document.createElement("a");
  aLink.style.display = "none";
  aLink.href = url;
  aLink.setAttribute("download", fileName); // 下载的文件
  document.body.appendChild(aLink);
  aLink.click();
  document.body.removeChild(aLink);
}

将通用方法引入使用页,传入后端返回数据和文件名即可下载。

 

### 如何通过前端调用接口实现字节流文件下载 #### 1. 前端实现字节流文件下载的核心逻辑 在前端开发中,当需要从后端获取字节流形式的文件(如 PDF、图片或其他二进制文件),可以通过发送 HTTP 请求来完成。通常情况下,可以采用两种主要方式:动态创建 `<a>` 标签或者利用第三方库 `FileSaver.js`。 以下是基于这两种方法的具体实现: --- #### 2. 方法一:动态创建 `<a>` 标签 此方法无需依赖额外的库,适合轻量级场景下的文件下载需求。 ```javascript function downloadFile(url, fileName) { fetch(url, { method: 'GET', headers: {} }) // 发起 GET 请求 .then(response => { if (!response.ok) throw new Error('Network response was not ok'); return response.blob(); // 将响应体转换为 Blob 对象 }) .then(blob => { const link = document.createElement('a'); // 创建 a 标签 link.href = URL.createObjectURL(blob); // 设置 href 属性为 Blob URL link.download = fileName || 'download'; // 设置下载后的文件名 document.body.appendChild(link); link.click(); // 自动触发点击事件 link.remove(); // 移除临时创建的 DOM 元素 }) .catch(error => console.error('Download failed:', error)); } ``` 上述代码实现了以下功能: - 使用 `fetch` API 获取服务器返回的数据流[^3]。 - 将接收到的二进制数据转化为 `Blob` 类型对象。 - 动态生成一个隐藏的 `<a>` 标签,并设置其属性以便浏览器能够识别并执行文件保存操作。 --- #### 3. 方法二:使用 FileSaver.js 库简化流程 如果项目中已引入或计划集成 `FileSaver.js`,则可进一步优化代码结构,减少手动处理的工作量。 安装命令如下: ```bash npm install file-saver --save ``` 实际应用中的代码片段如下所示: ```javascript import { saveAs } from 'file-saver'; function downloadWithFileSaver(url, fileName) { fetch(url, { method: 'GET' }) // 发送请求至指定地址 .then(response => { if (!response.ok) throw new Error('Failed to retrieve the resource.'); return response.blob(); }) .then(blob => { saveAs(blob, fileName || 'defaultFileName'); // 利用 FileSaver 提供的方法直接存储文件 }) .catch(error => console.error('Error during downloading:', error)); } ``` 这种方法的优势在于封装程度更高,开发者只需关注核心业务逻辑即可。 --- #### 4. 注意事项 无论选用哪种方案,在实际部署过程中均需注意以下几个方面: - **跨域问题**:确保前后端之间不存在 CORS (Cross-Origin Resource Sharing) 配置冲突[^4]。 - **超时控制**:针对大体积文件传输可能引发的时间过长情况,建议合理配置 timeout 参数。 - **错误捕获机制**:完善异常处理策略以提升用户体验。 此外,还需确认服务端是否正确设置了 MIME-Type 和 Content-Disposition 头部信息,这直接影响客户端能否正常解析及展示目标资源[^5]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值