js下载blob二进制文件流
创始人
2025-06-01 02:51:48
0

js下载blob二进制文件流

项目需求

  1. 在项目开发中,经常会遇到需要调用接口从后端获取Blob二进制文件流,在前端通过Blob二进制文件流下载文件的需求。

Blob

  1. Blob(Binary Large Object):表示二进制类型的大对象。在数据库管理系统中,将二进制数据存储为一个单一个体的集合。Blob 通常是影像、声音或多媒体文件。在 JavaScript 中 Blob 类型的对象表示不可变的类似文件对象的原始数据。

  2. Blob构造函数语法:

    new Blob(blobParts, options);
    
    • blobParts:Blob / BufferSource / String值的数组
    • options:可选对象
      • type:Blob 类型,通常是 MIME 类型,例如 text/plain
        • endings:默认值为 transparent ,用于指定包含行结束符 \n 的字符串如何被写入;第二个值为native,代表行结束符会被更改为适合宿主操作系统文件系统的换行符。

文件下载

  1. 首先创建一个axios实例用于请求接口,从后端获取blob二进制流文件

    import axios from "axios";const service = axios.create({// axios中请求配置有baseURL选项,表示请求根路径baseUrl: 'http:xx.xxx.xx.xx',// 超时timeout: 60000
    })
    
  2. 封装下载blob二进制流文件的方法

    import { Message } from "element-ui";/*** * @param {*} url 接口url* @param {*} data 接口传参* @param {*} filename 文件名 */
    export function downloadFile (url, data, filename) {return service.post(url, data, {// axios将响应的数据强制转为blobresponseType: 'blob',headers: {"Content-Type": "application/json;charset=UTF-8",},}).then((res) => {// 判断接口返回的数据类型,若返回类型为application/json,则证明获取二进制文件流失败if (res.type === 'application/json') {//创建一个FileReader实例const reader  = new FileReader();//读取文件reader.readAsText(response.data, 'utf-8');reader.onload = function() {//读取完成后,获取msg接口返回信息,const  {msg}  = JSON.parse(reader.result);// 使用Message组件弹出错误提示,如Message({ message: msg, type: "error" });}return;}// 接口返回数据为二进制流文件const content = res;// 根据接口返回的二进制流创建Blob类文件对象const blob = new Blob([content]);// 使用原生js创建一个a元素标签const elink = document.createElement("a");// 获取方法形参中的filename文件名elink.download = filename;// 通过原生js让a标签的display属性值为none,从而隐藏a标签elink.style.display = "none";// 通过blob创建下载的链接const href = URL.createObjectURL(blob);// 通过原生js让a标签的href属性为创建好的下载链接elink.href = URL.createObjectURL(blob);// 在html中添加a标签document.body.appendChild(elink);// 给a标签调用点击事件,开始下载elink.click();// 释放掉blob对象URL.revokeObjectURL(elink.href);// 在html中移除此a标签document.body.removeChild(elink);}).catch((err) => {console.error(err);});
    }
    
  3. 在vue项目utils文件夹下创建名为downloadFile.js的文件(文件名随意),将上述两段代码复制粘贴其中。

  4. 使用封装好的下载文件方法

    // 引入封装好的下载方法,引入路径为相对路径
    import { downloadFile } from '../downloadFile.js'const batchCode = '28256'
    downloadFile('/photoreview/photoDeal/downLoadPhotoZip', { batchCode: batchCode }, batchCode + `批次相片.zip`).then(() => {// 文件下载成功后的操作...
    })
    

总结

  1. 文件下载主要分为以下几步:
    1. 获取二进制文件流
    2. 根据二进制流创建Blob类文件对象
    3. 创建一个a元素标签,并隐藏起来
    4. 通过创建的Blob类文件对象创建下载链接
    5. 给a标签指定文件名和下载链接
    6. 将a标签添加进html中,并调用点击事件,下载文件
    7. 下载后释放掉Blob类文件对象,并在html中移除此a标签

相关内容

热门资讯

最新或2023(历届)中国元旦...  最新或2023(历届)中国元旦放假安排通知  最新或2023(历届)1月1日至1月3日,放假3天。...
大学新生军训广播稿 大学新生军...   大学新生军训广播稿(1)  年少的时候,总以为当兵是一首轻松浪漫的歌,歌里有绿色的橄榄枝,枝头挂...
最新或2023(历届)十八届五...  中共中央政治局10月12日召开会议,研究制定国民经济和社会发展第十三个五年规划重大问题,审议通过《...
有关微笑的校园广播稿 有关快乐...   甲:美丽的校园我的家,有你,有我,也有他!  乙:敬爱的老师们,亲爱的同学们  合:大家好!  ...
最新或2023(历届)十八届五... 最新或2023(历届)十八届五中全会什么时候召开?具体的召开时间通知已经公布,欢迎大家关注下文:  ...
预防疾病校园广播稿 预防疾病校...  甲:美丽的校园我的家,有你,有我,也有他!  乙:敬爱的老师们,亲爱的同学们  合:大家好!  甲...
小学生光盘行动广播稿 小学生光...  甲:大家好!很高兴和大家相会在这一期的红领巾广播站,我是主持人xxxx  乙:我是主持人xxxx首...
300字大学军训广播稿 300...  300字大学军训广播稿【1】  坚强,是生活在这个世界上的每个生物所具备的美好品质。  一望无垠的...
文明礼仪在心中校园广播稿 校园...   女:朝霞托着红日,徐徐从东方升起。  男:一个灿烂的日子,撒满大地。  女:春风吹,阳光照,语言...
勤奋主题小学生校园广播稿 勤奋...  甲:大家好,红领巾广播又准时和大家见面了  乙:本期红领巾广播的主题是《天才出于勤奋》  甲:有一...
尊重别人学会宽容校园广播稿 宽... 甲:当灿烂的晨曦温暖着整个校园,采撷一缕阳光,编织成七彩的花环。  乙:留住一丝清风播撒出希望的明天...
校园广播稿——学会做人 诚信做...   本期的红领巾小广播的主题是——《学做人、做好人》  甲:做人要诚实守信。  乙:做事要严己宽人。...
争做守法好少年校园广播稿 争做...   老师们、同学们:  甲乙:大家中午好!红领巾广播开始了。这一周广播的主题是“争做守法好少年”。 ...
教师节活动主持词开场白 教师节...   教师节主持人开场白台词如何写,可以是一台晚会进行的生动活泼呢,教师节的主持人开场白的描写可以有感...
最新或2023(历届)读书主题...   伴奏《校园的早晨》  甲:xx校园我的家,  乙: 你是太阳我是花。  甲:伴随着欢快的歌声,红...
学院迎新晚会主持词 学院迎新晚...   走进十月,我们用一样的眼神凝望金秋;凝望金秋,我们用一样的心情渴望收获。又是一年开学季,你期待什...
最新或2023(历届)迎新晚会...  激扬着青春的风采,我们向金秋走来,一路欢歌,一路笑语,万物在翘首期盼中安然舒怀。又开学了,迎来了一...
秋季学校迎新晚会主持词 部队元...  凉风习习,秋风送爽,金秋额的时节,我们又迎来了开学季。告别酷热的暑假,我们又要回到熟悉的校园开展新...
大学迎新晚会主持词开场白和结束...   脚踏着青春的节拍,我们向金秋走来,一路欢歌,一路笑语,万物在金秋的九月欣然等待。在这丹桂飘香的日...
最新或2023(历届)大学迎新...   大学是我们向往已久的天堂,刚上大学的你,期待什么样的开学迎新晚会呢?你希望师兄师姐们都会举办什么...