vue 将后端返回的二进制流进行处理并实现下载
什么是二进制流文件?
二进制文件是一种计算机文件格式,它的数据以二进制形式存储,与文本文件不同。二进制文件可以包含任意类型的数据,例如图像、音频、视频、可执行文件、压缩文件等,而文本文件则仅仅包含 ASCII 码或其他编码的字符数据。
二进制文件的底层原理是将数据以二进制形式存储在文件中。在计算机中,所有的数据都是以二进制形式表示的,包括数字、字符、图像、音频、视频等。二进制文件通过按照特定的格式将这些二进制数据存储在文件中,以便在需要时能够正确地读取和使用。
二进制流常见的 Blob、ArrayBuffer、File、FileReader 和 FormData
二进制流长啥样?如下图:

获取二进制流文件的方法
/** 获取二进制流文件* @param url 请求地址* @param params 请求参数* @param method 请求方式,默认:'POST'* @param configType 设置响应类型* 'arraybuffer':设置响应类型为二进制对象(返回的是一个包含二进制数据的 JavaScript ArrayBuffer 类型化数组)* 'blob':设置响应类型为二进制对象(返回的是一个包含二进制数据的 Blob 对象)* @returns {Promise<void>} 请求结果*/
async getBinaryFile(url, params, method = 'POST', configType = 'arraybuffer') {const headConfig = {responseType: configType // 设置响应类型}let res = {} // 请求结果switch (method.toLowerCase()) {case 'get':res = await axios.get(url, { params, ...headConfig }) // get 请求方式breakcase 'post':res = await axios.post(url, params, { ...headConfig }) // post 请求方式break}this.downloadBinaryFile(res.data, '项目介绍.txt') // 下载二进制文件
},
下载二进制流文件的方法
/** 下载二进制流文件* @param binFile 二进制文件流* @param fileName 文件名,例如:测试文本.txt* @param blobType Blob 对象的 type 属性给出文件的 MIME 类型,默认:'application/octet-stream'(用于通用二进制数据)*/
downloadBinaryFile(binFile, fileName, blobType = 'application/octet-stream') {// 处理二进制数据并创建 Blob 对象const blobObj = new Blob([binFile], { type: blobType })// 创建一个链接并设置下载属性const downloadLink = document.createElement('a')let url = window.URL || window.webkitURL || window.moxURL // 兼容不同浏览器的 URL 对象url = url.createObjectURL(blobObj)downloadLink.href = urldownloadLink.download = fileName // 设置下载的文件名// 将链接添加到 DOM 中,模拟点击document.body.appendChild(downloadLink)downloadLink.click()// 移除创建的链接和释放 URL 对象document.body.removeChild(downloadLink)window.URL.revokeObjectURL(url)
}
完整代码
在 Vue.js 中,可以通过使用 axios 或其他类似的 HTTP 库从后端获取二进制数据,并通过前端进行处理以实现文件下载。以下是一个简单的示例,使用 axios 和 Blob 对象来处理二进制数据。
首先,确保你的 Vue 项目中已经安装了 axios 网络请求库
npm install axios
然后,在你的 Vue 组件中,可以这样处理后端返回的二进制流
<!-- 下载二进制流文件 -->
<template><div><button @click="getBinaryFile('YOUR_BACKEND_API_ENDPOINT', { id: '' })">下载文件</button></div>
</template><script>
import axios from 'axios'export default {methods: {/** 获取二进制流文件* @param url 请求地址* @param params 请求参数* @param method 请求方式,默认:'POST'* @param configType 设置响应类型* 'arraybuffer':设置响应类型为二进制对象(返回的是一个包含二进制数据的 JavaScript ArrayBuffer 类型化数组)* 'blob':设置响应类型为二进制对象(返回的是一个包含二进制数据的 Blob 对象)* @returns {Promise<void>} 请求结果*/async getBinaryFile(url, params, method = 'POST', configType = 'arraybuffer') {const headConfig = {responseType: configType // 设置响应类型}let res = {} // 请求结果switch (method.toLowerCase()) {case 'get':res = await axios.get(url, { params, ...headConfig }) // get 请求方式breakcase 'post':res = await axios.post(url, params, { ...headConfig }) // post 请求方式break}this.downloadBinaryFile(res.data, '项目介绍.txt') // 下载二进制文件},/** 下载二进制流文件* @param binFile 二进制文件流* @param fileName 文件名,例如:测试文本.txt* @param blobType Blob 对象的 type 属性给出文件的 MIME 类型,默认:'application/octet-stream'(用于通用二进制数据)*/downloadBinaryFile(binFile, fileName, blobType = 'application/octet-stream') {// 处理二进制数据并创建 Blob 对象const blobObj = new Blob([binFile], { type: blobType })// 创建一个链接并设置下载属性const downloadLink = document.createElement('a')let url = window.URL || window.webkitURL || window.moxURL // 兼容不同浏览器的 URL 对象url = url.createObjectURL(blobObj)downloadLink.href = urldownloadLink.download = fileName // 设置下载的文件名// 将链接添加到 DOM 中,模拟点击document.body.appendChild(downloadLink)downloadLink.click()// 移除创建的链接和释放 URL 对象document.body.removeChild(downloadLink)window.URL.revokeObjectURL(url)}}
}
</script>
确保替换 `YOUR_BACKEND_API_ENDPOINT` 为你的后端API的实际地址,并设置适当的文件名。
这个例子中,我们使用了 axios 来获取后端返回的二进制数据,然后使用 Blob 对象创建一个包含该二进制数据的 Blob,最后创建一个下载链接并模拟点击以触发文件下载。
注意:浏览器的同源策略可能会限制跨域请求。如果你的前端和后端不在同一个域下,你可能需要在后端配置 CORS(跨域资源共享)来允许前端访问。
关于 Blob 的 content-type 的部分媒体类型
".*"="application/octet-stream"
".001"="application/x-001"
".301"="application/x-301"
".323"="text/h323"
".906"="application/x-906"
".907"="drawing/907"
".a11"="application/x-a11"
".acp"="audio/x-mei-aac"
".ai"="application/postscript"
".aif"="audio/aiff"
".aifc"="audio/aiff"
".aiff"="audio/aiff"
".anv"="application/x-anv"
".asa"="text/asa"
".asf"="video/x-ms-asf"
".asp"="text/asp"
".asx"="video/x-ms-asf"
".au"="audio/basic"
".avi"="video/avi"
".awf"="application/vnd.adobe.workflow"
".biz"="text/xml"
".bmp"="application/x-bmp"
".bot"="application/x-bot"
".c4t"="application/x-c4t"
".c90"="application/x-c90"
".cal"="application/x-cals"
".cat"="application/vnd.ms-pki.seccat"
".cdf"="application/x-netcdf"
".cdr"="application/x-cdr"
".cel"="application/x-cel"
".cer"="application/x-x509-ca-cert"
".cg4"="application/x-g4"
".cgm"="application/x-cgm"
".cit"="application/x-cit"".doc"="application/msword"
".docx"="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
".rtf"="application/rtf"
".xls"="application/vnd.ms-excel application/x-excel"
".xlsx"="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
".ppt"="application/vnd.ms-powerpoint"
".pptx"="application/vnd.openxmlformats-officedocument.presentationml.presentation"
".pps"="application/vnd.ms-powerpoint"
".ppsx"="application/vnd.openxmlformats-officedocument.presentationml.slideshow"
".pdf"="application/pdf"
".swf"="application/x-shockwave-flash"
".dll"="application/x-msdownload"
".exe"="application/octet-stream"
".msi"="application/octet-stream"
".chm"="application/octet-stream"
".cab"="application/octet-stream"
".ocx"="application/octet-stream"
".rar"="application/octet-stream"
".tar"="application/x-tar"
".tgz"="application/x-compressed"
".zip"="application/x-zip-compressed"
".z"="application/x-compress"
".wav"="audio/wav"
".wma"="audio/x-ms-wma"
".wmv"="video/x-ms-wmv"
".mp3, .mp2, .mpe, .mpeg, .mpg"="audio/mpeg"
".rm"="application/vnd.rn-realmedia"
".mid, .midi, .rmi"="audio/mid"
".bmp"="image/bmp"
".gif"="image/gif"
".png"="image/png"
".tif, .tiff"="image/tiff"
".jpe, .jpeg, .jpg"="image/jpeg"
".txt"="text/plain"
".xml"="text/xml"
".html"="text/html"
".css"="text/css"
".js"="text/javascript"
".mht, .mhtml"="message/rfc822"
关于 responseType 的值
"" - 设为空字符串与设置为 "text" 相同,默认类型
"text" - 返回的是包含在 DOMString 对象中的文本
"document" - 返回的是一个 HTML Document 或 XML XMLDocument
"arraybuffer" - 返回的是一个包含二进制数据的 JavaScript ArrayBuffer
"blob" - 返回的是一个包含二进制数据的 Blob 对象
"json" - 返回的是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为 JSON 解析得到的
"ms-stream" - 返回的是下载流的一部分;此响应类型仅允许下载请求,并且仅受 Internet Explorer 支持
相关文章:
vue 将后端返回的二进制流进行处理并实现下载
什么是二进制流文件? 二进制文件是一种计算机文件格式,它的数据以二进制形式存储,与文本文件不同。二进制文件可以包含任意类型的数据,例如图像、音频、视频、可执行文件、压缩文件等,而文本文件则仅仅包含 ASCII 码或…...
PyCharm连接远程服务器
要求:PyCharm专业版才支持远程服务 一、创建远程连接 先建立本地与远程服务器之间的SSH连接 1、配置连接 2、建立SSH连接,选择文件传输协议 SFTP 3、设置服务器名(可以随意命名) 4、配置 SSH连接 点击 172.18.1.202 配置…...
使用Qt制作网易云播放器的歌曲排行界面
!!!直接上图!!! !!!直接上图!!! !!!直接上图!!! 网易云排行榜…...
【.NET Core】特性(Attribute)详解
【.NET Core】特性(Attribute)详解 文章目录 【.NET Core】特性(Attribute)详解一、概述二、编写自定义属性2.1 自定义特性的主要步骤2.2 应用AttributeUsageAttributeAttributeTargets 成员Inherited属性AllowMultiple属性 三、声…...
【C++】POCO学习总结(十九):哈希、URL、UUID、配置文件、日志配置、动态库加载
【C】郭老二博文之:C目录 1、哈希 1.1 说明 std::map和std::set 的性能是:O(log n) POCO哈希的性能比STL容器更好,大约快两; POCO中对应std::map的是:Poco::HashMap; POCO中对应std::set的是 Poco::Hash…...
1846_安全SPI
Grey 全部学习内容汇总:GitHub - GreyZhang/g_embedded: some embedded basic knowledge. 1846_安全SPI SPI是一种常见的通信方式,在汽车电子中比较常用。但是如果涉及到安全相关的设计,可能得考虑更多。而SPI协议本身没有很好的标准化&am…...
SQL Server ,使用递归查询具有层级关系的数据。
假设我们有一个表格 Employees,其中包含员工的层级关系信息,每一行包括员工的ID、姓名以及上级员工的ID。 下面是一个示例表格及其数据: Employees ---------------------- EmployeeID | Name | ManagerID ---------------------- 1 …...
【参数汇总】mysql服务端/客户端常见优化参数
mysql服务端参数 1、innodb_buffer_pool_size (innodb索引buffer pool缓冲区大小) 默认大小为128M, 官方推荐其配置为系统内存的 50% 到 75% 。 一般innodb_buffer_pool_size要结合以下两个参数来设置: innodb_buffer_pool_ch…...
LeetCode 142. 环形链表 II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整…...
Leetcode刷题笔记题解(C++):224. 基本计算器
思路: step 1:使用栈辅助处理优先级,默认符号为加号。 step 2:遍历字符串,遇到数字,则将连续的数字字符部分转化为int型数字。 step 3:遇到左括号,则将括号后的部分送入递归&#x…...
还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis
文章目录 前言一、📖MyBatis简介1.Mybatis历史2.MyBatis特性3.对比(其他持久化层技术) 二、📣搭建MyBatis1.开发环境2.创建maven工程3.创建MyBatis核心配置文件4.创建mapper接口5.创建MyBatis的映射文件6.通过junit测试功能7.加入…...
C# WPF上位机开发(树形控件在地图软件中的应用)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们聊过图形软件的开发方法。实际上,对于绘制的图形,我们一般还会用树形控件管理一下。举个例子,一个地图…...
【华为】文档中命令行约定格式规范(命令行格式规范、命令行行为规范、命令行参数格式、命令行规范)
文章目录 命令行约定格式**粗体:命令行关键字***斜体:命令行参数*[ ]:可选配置{ x | y | ... } 和 [ x | y | ... ]:选项{ x | y | ... }* 和 [ x | y | ... ]*:多选项&<1-n>:重复参数#ÿ…...
Trie 字典树(c++)(前缀)
题目链接:用户登录 题目: 样例: 输入 5 3 aaa aba aabbaa abbbbb cdd aabba abc abab 输出 Y N N 思路: 根据题目意思,要用到 Trie 字典树算法。 Trie 字典树,顾名思义,“字典”࿰…...
全球移动通信(2G/3G/4G/5G)频谱分布情况
一、概述 随着通信技术的不断发展,全球各国都在积极推进2G、3G、4G、5G网络的建设和应用。根据FCC统计,目前全球移动通信频谱分布如下: 二、分布 (一)俄罗斯 2G:主要使用900MHz和1800MHz两个频段。其中&…...
【04】GeoScene导出海图或者电子航道图000数据成果
1创建一个带有覆盖面和定义的产品 如果你没有已存在的S-57数据,你可以通过捕捉新的产品覆盖范围(多边形产品范围)及其所需的产品定义信息(产品元数据)来为新产品创建基础。 注: 如果你已经有一个S-57数据…...
安卓端出现https请求失败(转)
背景# 某天早上,正在一个会议时,突然好几个同事被叫出去了;后面才知道,是有业务同事反馈到领导那里,我们app里面某个功能异常。 具体是这样,我们安卓版本的app是禁止截屏的(应该是app里做了拦…...
appium2.0.1安装完整教程+uiautomator2安装教程
第一步:根据官网命令安装appium(Install Appium - Appium Documentation) 注意npm前提是设置淘宝镜像: npm config set registry https://registry.npmmirror.com/ 会魔法的除外。。。 npm i --locationglobal appium或者 npm…...
Hbase的Rowkey设计
Hbase的Rowkey设计 rowkey设计 # 1)长度原则# 最大64KB,推荐长度10~100 byte# 最好设为8的倍数,能短则短,rowkey如果太长会影响性能。# 2)唯一原则:rowkey应该具备唯一性# 3)散列原则…...
软考机考考试第一批经验分享
由于机考的特殊性,考试环境与传统笔试环境有所不同。下面是与考试环境相关的总结: 草稿纸:考场提供足够数量的草稿纸,每位考生都会分发一张白纸作为草稿纸。在草稿纸上需要写上准考证号。如果不够用,可以向监考老师再次…...
从CPython 3.12到3.14:我们逆向了217个AOT相关PR,提炼出6个决定编译成功率的核心宏定义(含Py_BUILD_CORE_MODULE与Py_LIMITED_API冲突解决方案)
第一章:Python 原生 AOT 编译方案 2026 高级开发技巧Python 社区在 2026 年迎来关键演进:CPython 官方正式集成原生 Ahead-of-Time(AOT)编译能力,无需依赖第三方运行时或 JIT 层即可生成平台专用的静态可执行文件。该特…...
OpenClaw个性化设置:Qwen3.5-9B模型参数调优实战
OpenClaw个性化设置:Qwen3.5-9B模型参数调优实战 1. 为什么需要调整模型参数? 上周我在用OpenClaw自动处理一批技术文档时,遇到了一个奇怪的现象:同样的任务指令,有时候AI能完美执行,有时候却会输出一堆无…...
第一次训练周赛I题分析
这题来解决的话需要我们思考怎么才能排序最多个,那么我们知道_是需要一个的,-是需要两个的,那么我们就让-放在_的左右边来排序试试呢?那么要是放在左右边左右各放多少呢?那不如就试试平均分配呢?那么想到这…...
KT0803K FM发射芯片Arduino驱动开发与射频工程实践
1. KT0803系列FM发射芯片Arduino库深度解析与工程实践指南1.1 芯片定位与系统级约束KT0803及其衍生型号(KT0803K/L/M)是高度集成的单芯片FM广播发射器,专为低功耗、小体积音频广播应用设计。该系列芯片内部集成了PLL频率合成器、立体声编码器…...
FLAC3D 6.0 和 7.0 版本输出塑形区体积及破坏区域体积那些事儿
FLAC3D输出塑形区体积,适用于6.0和7.0版本,输出剪切破坏区域,张拉破坏区域体积,如图2中所示在岩土工程数值模拟领域,FLAC3D 是一款相当强大的工具。今天咱就聊聊如何在 FLAC3D 6.0 和 7.0 版本中输出塑形区体积&#x…...
感知损失(Perceptual Loss)在图像风格迁移中的关键作用与实现
1. 为什么感知损失能让AI画出更像艺术家的画? 第一次用传统MSE损失做风格迁移时,我盯着生成的"梵高星空"直挠头——颜色位置都对,但怎么看都像小学生涂鸦。直到尝试了感知损失,画面突然有了笔触的韵律感。这背后的秘密…...
AI开发AI:借助快马多模型能力,迭代式构建你的智能健康管理Agent
最近在尝试开发一个健康管理AI助手,发现用传统方式写代码调试特别耗时。后来尝试了InsCode(快马)平台,发现用AI对话的方式迭代开发简直打开了新世界。记录下这个"用AI开发AI"的完整过程: 基础框架搭建 最开始只需要一个能交互的对话…...
开源吐槽大会:技术圈的幽默自省
开源项目吐槽大会技术文章大纲主题与目的开源项目吐槽大会旨在通过幽默、犀利的视角,揭示开源生态中的常见问题,促进开发者反思与改进。文章将从技术、社区、维护等角度展开,兼顾娱乐性与建设性。核心内容结构技术层面的经典槽点 依赖地狱&am…...
如何用滑模控制(SMC)解决机器人轨迹跟踪中的抖动问题?5个实战技巧分享
如何用滑模控制(SMC)解决机器人轨迹跟踪中的抖动问题?5个实战技巧分享 当机械臂在执行高精度焊接任务时,末端执行器突然出现5Hz的高频震颤——这种场景对工业机器人工程师而言绝不陌生。滑模控制(SMC)因其强…...
香橙派Armbian系统下,用apt一键安装OpenCV的完整流程(含GPG报错解决)
香橙派Armbian系统下OpenCV-Python极简安装指南:绕过源码编译的终极方案 在单板计算机领域,香橙派凭借其出色的性价比逐渐崭露头角。当开发者尝试在这类ARM架构设备上构建计算机视觉应用时,OpenCV往往是不可或缺的核心工具。然而,…...
