【前端处理二进制文件流】

这个需求其实做了很久了,但是今天突然被人问起,自己却不知所措,表达不完整,所以想重新梳理一下。
问题叙述 : 有时候需要点击一个 按钮 ,实现文件下载 ,而后端返回的数据为二进制流数据。


产生原因
前端页面的编码格式和服务端编码格式不同,正如此时,服务端返回的是 blob格式的数据,而我们使用的是 非 blob格式去解析,所以产生了乱码。
首先

接收二进制流
要想处理这段乱码的数据,首先得先接收,正常情况下axios 不会处理二进制数据,即会去接收但是不会去处理,需要在请求得适合设置 responseType: ‘blob’

axios.get({
    url: 'xxxxxx',
    method: 'get',
    data:{
     },
    responseType: 'blob', // 声明返回blob格式
}).then(res => {
	downLoadBlobFile(res.data, fileName, mimeType);
});

Blob
Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

二进制流转为 URL
拿到文件流之后,需要生成一个 URL 来实现下载,我们可以通过 URL.createObjectURL() 方法生成一个链接。

const blob = new Blob([res.data])  // res.data 为接口返回的数据,依实例而行
const URL = URL.createObjectURL(blob)  // 生成一个 Blob URL


这时候后端返回的文件流就会被保存在内存里,而生成的URL 就是文件流在内存中的地址(这个地址为临时的,浏览器在 document 卸载时,会自动释放它们)。

【a 标签添加文件名】
正常情况下,通过 window.location = url 就可以下载文件。浏览器判断这个链接是资源而不是页面,就会自动下载文件。
但是通过文件流生成的url 对应的资源是没有文件名的,需要添加文件名。这时候我们需要创建一个 a 标签实现这个功能。

const fileName = 'xxxx.xls'  // 文件名+后缀
const listNode = document.createElement("a")
listNode.download = fileName 
listNode.style.display = "none"
listNode.href = URL // 文件流生成的url
document.body.appendChild(listNode)
listNode.click()  // 模拟在按钮上实现一次鼠标点击
URL.revokeObjectURL(listNode.href)  // 释放 URL 对象
document.body.removeChild(listNode)  // 移除 a 标签


这样就完成了
 

前端处理二进制文件并将其转换为URL地址通常涉及到文件的上传和下载。通常,二进制文件是指文件二进制形式进行传输的数据,而URL地址是用于在网络中定位资源的字符串。当你需要将前端接收到的二进制文件流转换为可以访问的URL地址时,可以遵循以下步骤: 1. **文件上传**:在前端,你首先需要使用表单或者 AJAX 技术将文件上传到服务器。这一步通常是通过一个文件输入(`<input type="file">`)配合表单提交或通过 JavaScript 的 `XMLHttpRequest` 或 `fetch` API 实现。 2. **服务器处理**:服务器接收到文件后,会将其保存在服务器上指定的位置。此时,服务器会返回一个URL地址,这个地址指向了刚刚上传的文件。这个URL地址可以是文件的直接路径,也可以是一个别名,具体取决于服务器的配置。 3. **生成URL地址**:服务器端在处理文件上传后,会生成一个指向该文件的URL地址,并将这个地址通过响应返回给前端。这个响应可以是JSON格式,其中包含了一个URL字段,前端拿到这个URL后就可以通过这个地址访问到上传的文件。 4. **前端读取URL地址**:前端在接收到包含URL的响应后,就可以使用这个URL来直接访问或显示这个文件了。 示例代码(JavaScript): ```javascript // 使用fetch API上传文件 fetch('/upload', { method: 'POST', body: fileStream // fileStream是从文件输入获取的二进制文件 }).then(response => response.json()) .then(data => { console.log(data.url); // 假设服务器返回的JSON数据中包含url字段 // 使用data.url来访问上传的文件 }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值