前端接收 type: “application/octet-stream“ 格式的数据并下载,解决后端返回不唯一

news2025/1/29 13:59:43

前端接收 type: “application/octet-stream“ 格式的数据并下载,还有后端既返回octet-stream还返回JSON数据时的处理方法

今天些项目的时候,后端改了一下文件下载的方式,打算用接口返回 type: “application/octet-stream“格式的数据,然后前端来处理下载。今天也是第一次用这种方法,查询了网上的内容总结了一下。

第一步

响应拦截器中作出初步的判断

image-20220319151205994

这里判断if是针对这种情况时做出的应对方法,可能还有其他情况,这里只是最简单的。

service.interceptors.response.use(
 response => {
   // 导出
   const headers = response.headers
   if (headers['content-type'] === 'application/octet-stream;charset=utf-8') {
     return response.data
   }
   ...//这里时其他的情况
 },
 error => {
   return Promise.reject(error)
 }
)

第二步

对api进行修改

这是我的axios的写法,按各自的走就行

第三步

发起请求,对请求到的数据进行处理下载

image-20220319152503306

   exportClick () {
         export().then(res => {
           const content = res
           const blob = new Blob([content])
           const fileName = '导出信息.xlsx'
           if ('download' in document.createElement('a')) { // 非IE下载
             const elink = document.createElement('a')//创建一个a标签通过a标签的点击事件区下载文件
             elink.download = fileName
             elink.style.display = 'none'
             elink.href = URL.createObjectURL(blob)//使用blob创建一个指向类型数组的URL
             document.body.appendChild(elink)
             elink.click()
             URL.revokeObjectURL(elink.href) // 释放URL 对象
             document.body.removeChild(elink)
           } else { // IE10+下载
             navigator.msSaveBlob(blob, fileName)
           }
         })
       }
本来是已经写完这个功能了,但后台告诉我有可能没有文件,然后他要给我返回json数据格式

我又懵了一会,又查了半天资料,终于是完善好了

当返回的数据类型既有可能是JSON又可能是octet-stream时

第一步

首先我们不能改变原来的代码

image-20220319164812278

这一行对于接收文件是必须的,但是这样又会让我们的数据变成blob类型
image-20220319164937461

上面是有文件时的样子

image-20220319165249257
这是没有文件的样子

可以注意到 blob有 type这个数据,我们就可以根据这个type来判断进行下一步处理

if (res.type == "application/json") {
    ...
}
if (res.type == "application/octet-stream"){
    ...
}      

其中是octet-stream类型时的操作我们上面就已经写道了
下面介绍如何转换为json

第二步:将blob转换为json数据

image-20220319165703987

这里要先用FilerReader,不可以直接使用JSON.parse

         if (res.type == "application/json") {
           // console.log("type == json");
           const reader = new FileReader(); //通过fileReader将blob类型的数据转换成json格式的数据
           reader.readAsText(res, "utf-8");
           reader.onload = function () {
             //读取完成后返回字符串形式的内容
             // console.log("reader.result", reader.result);
             const msg = JSON.parse(reader.result);
             console.log("JSON转换结果", msg);
			  //...这里时对转换后结果的操作
             }
           };
         }

到这里下载文件的种种问题就解决啦,写个博客纪念一下,第一次处理这种问题

借鉴原作者:https://blog.csdn.net/u010598111/article/details/85052865?ops_request_misc=&request_id=&biz_id=102&utm_term=vue%E6%8E%A5%E6%94%B6application/octet-stream&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-85052865.142v2pc_search_result_control_group,143v4control&spm=1018.2226.3001.4187

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/407692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微信小程序】全局配置

目录 全局配置文件及常用的配置项 全局配置 - window 1. 小程序窗口的组成部分 2. 了解 window 节点常用的配置项 3. 设置导航栏的标题 4. 设置导航栏的背景色 5. 设置导航栏的标题颜色 6. 全局开启下拉刷新功能 7. 设置下拉刷新时窗口的背景色 8. 设置下拉刷新时 lo…

echarts 柱状图滚动

实现效果:柱形图展示水平滚动条,并且鼠标滚动支持让滚动条平移 echarts文档里,图形的滚动条分两种 内置型 (效果是: 鼠标在图中点击拖动平移,在图中滚动缩放)滚动条型 (效果是&…

高德地图自定义图标的点标记Marker--初体验(二)

点标记Marker创建一个默认图标的点标记:创建一个自定义图标的点标记:new AMap.Marker({}) 参数说明本文以Marker为主,其他点标记方法大差不差 通过上两篇文章我们已经了解到如何引入高德地图并进行初始化了,本文主要讲解普通点标记Marker,Marker 类型推荐…

框架获取当前登录用户以及用户信息

CSDN话题挑战赛第2期 参赛话题:学习笔记 前言 📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端中级工程师 🔥 三连支持:如果此文还不错的话,还请 ❤️关注、&…

设置浏览器显示小于12px以下字体的三种方法

使用场景: 以往设计图给的字号一般最小就是12px, 开发人员一般是使用谷歌浏览器来进行调试运行。 谷歌浏览器上显示字体最小为12px,css设置font-size:10px,运行代码显示结果仍然是12px大小,但是挡不住甲方…

TypeError The view function did not return a valid response. The function either returned None 的解决

使用flask框架制作登录、注册的页面时,app.py运行成功,数据库有用户,1234,密码也是1234 点击登录之后, 报如下错误。 TypeError TypeError: The view function did not return a valid response. The function either …

Vue3中的父传子和子传父如何实现

大家都知道Vue2中父传子是通过父组件绑定一个属性,子组件再用props进行接收,子传父是通过this.$emit那么Vue3中有什么不同呢?以下为您解答谜团 #Vue3的父传子 一.现在父组件调用子组件的时候,通过动态属性把数据传递过去 二.在子组件通过prop…

XSS漏洞及其原理(详解)

文章目录前言一、XSS漏洞原理1.概述2.利用方式3.执行方式4.攻击对象5.XSS危害(1)窃取cookie(2)未授权操作(3)传播蠕虫病毒6.简单代码7.XSS验证8.二、XSS漏洞分类1.反射型XSS原理特点举个栗子:2.…

EasyExcel使用与步骤

一、导入依赖&#xff08;3.1.0版本不需要poi依赖&#xff09; <!-- easyExcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>二、写数据…

nvm下node安装;node环境变量配置

1、nvm安装 1、双击安装文件 nvm-setup.exe 2、选择nvm安装路径 3、选择nodejs路径 4、确认安装即可 5、安装完确认 打开CMD&#xff0c;输入命令 nvm &#xff0c;安装成功则如下显示。可以看到里面列出了各种命令&#xff0c;本节最后会列出这些命令的中文示意。 6、…

nodejs和npm版本不匹配

前言&#xff1a;我是因为要用vue创建项目&#xff0c;之后发现创建项目创建不上去&#xff0c;我想的是安装vue的脚手架工具&#xff0c;但是npm死活安装不上去&#xff0c;一直报错&#xff0c;我是一直在网上找解决方法&#xff0c;之后我自己终于解决了&#xff0c;心情是非…

解决el-tree子节点过多导致渲染缓慢问题

1、问题背景 在使用el-tree中&#xff0c;通常会调用后端接口从而去渲染tree。若后端返回数据量过于庞大&#xff0c;则会导致el-tree渲染缓慢的问题。此时我们通常会使用懒加载tree的方式&#xff0c;也就是点击某一个节点后去调取接口动态获取该节点的子数据。这种方式的确会…

DevOps系列文章 - K8S构建Jenkins持续集成平台

k8s安装直接跳过&#xff0c;用Kubeadm安装也比较简单安装和配置 NFSNFS简介NFS&#xff08;Network File System&#xff09;&#xff0c;它最大的功能就是可以通过网络&#xff0c;让不同的机器、不同的操作系统可以共享彼此的文件。我们可以利用NFS共享Jenkins运行的配置文件…

H5项目如何打包成APP

开发uni-app的编辑器HBuilderX可以将H5项目打包成APP&#xff0c;相信很多小伙伴还不知道这个功能。下面将介绍下如何将H5打包成APP。 HBuilderX下载链接&#xff1a;https://www.dcloud.io/hbuilderx.html 1.新建5APP项目 选择文件>新建>项目&#xff0c;新建5APP项目…

.env 文件

.env 文件配置 文件说明 .env&#xff1a;全局默认配置文件&#xff0c;无论什么环境都会加载合并。 .env.development&#xff1a;开发环境的配置文件 .env.production&#xff1a;生产环境的配置文件 注意&#xff1a;三个文件的文件名必须按上面方式命名&#xff0c;不能乱…

推荐10个基于Vue3.0全家桶的优秀开源项目

目录 PPTist vue-next-admin Vue vben admin VUE3-MUSIC vue-pure-admin vue3-composition-admin newbee-mall-vue3-app Element Plus vue3-bigData cool-admin-vue 今天来分享 10 个基于 Vue3.0 全家桶的优秀开源项目&#xff01; PPTist PPTist 是一个基于 Vue3.…

【Vue路由(router)进一步详解】

Vue路由&#xff08;router&#xff09;进一步详解query属性具体实例代码如下&#xff1a;params属性具体实例代码如下&#xff1a;props属性replace属性编程式路由导航路由缓存具体代码&#xff1a;总结本篇文章主要针对已经掌握Vue路由&#xff08;router&#xff09;基础以及…

Vue业务组件封装(二)Form表单

前言 这个系列主要是分享自己在工作中常用到的业务组件&#xff0c;以及如何对这些组件进行有效的封装和封装的思路。注&#xff1a;都是基于element ui进行二次封装。 封装组件的基本方法就是通过props和emit进行父子组件的传值和通信。利用插槽、组件等增加组件的可扩展性和复…

JavaScript实现留言板

目录 1.案例说明&#xff1a; 2.html部分 3.css部分 4.js代码 5.全部代码 6.效果图&#xff1a; 1.案例说明&#xff1a; 利用JavaScript、css以及html制作一个简易的留言板 要求在页面文本框中输入一些文字之后&#xff0c;点击“提交”按钮&#xff0c;就可以让输入的…

React+Mobx|综合项目实践(附项目源码、地址)

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac