前端调接口下载(导出)后端返回.zip压缩文件流(的坑!)

这篇具有很好参考价值的文章主要介绍了前端调接口下载(导出)后端返回.zip压缩文件流(的坑!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:基于vue2+element-ui的一个后台管理系统,需求评审要加一个导入导出文件的功能,由于可能导出的数据量过大(几十万条数据),下载时间过长,所以用.zip压缩文件替代excel文件

本人以前也做过导出文件的功能,但是用的方法是后端处理数据然后放到另一个服务器上,前端要做的就是window.open 打开这个默认地址加返回的地址拼接成的链接就可以自动下载了

但是现在新入职的这家公司后端老哥明确告诉我:不行!没办法了,百度csdn chatgpt搜吧。。。。

经过一堆无用答案和无数的坑后终于有了解决办法,参考https://blog.csdn.net/Amy126/article/details/113882421  老哥和其他各种老哥的方法

总结:1.在接口处设置responseType和headers:

export function searchPersonnelHousInfoExport(query) {
    return request({
      baseUrl: '/api-login',
      url: '/miniadmin/personnelHous/searchPersonnelHousInfoExport',
      method: 'GET',
      params: query,
      responseType: 'blob', //注意
      headers: {            //注意
        'Content-Type': 'application/json; application/octet-stream'
      }
    })
  }

2.调用接口(注意设置文件格式)

async exportex(){
      let postData = {
        current: this.currentPage,
        size: this.pageSize
      }
      let res = await searchPersonnelHousInfoExport(postData)
      let blob = new Blob([res.data], { type: 'application/zip' }); //设置下载的内容以及格式
      const url = window.URL.createObjectURL(blob); //设置路径
      const link = window.document.createElement('a'); // 创建a标签
      link.href = url;
      let filename = res.headers['content-disposition']
        .split(';')[1]
        .split('filename=')[1]
      let decodedURL = decodeURIComponent(filename); //解码,返回的是文件流所以我从res.header里面拿的文件名,但是是编码后的%E4巴拉巴拉的,所以拿来用的话要在前端解码
      link.download = decodedURL; //设置文件名
      link.style.display = 'none';
      link.click();
      console.log(link,'res')

      URL.revokeObjectURL(url);
}

3.如果下载下来是一堆乱码或解析不了文件,去看看是否在main.js引入了mockjs,非必要就不引入,如果确实需要就这样:

前端下载zip文件流,vue.js,前端,javascript

 

 

————————————————————分割线————————————————————

摸索过程(出现各种问题的原因,时间着急的同学可以跳过):新入职的这个公司没弄过这个东西,所以就得自己下载处理接口返回的文件流,也就是那“一堆乱码”,当时打印res发现res.header里有一个地址,打开发现能直接下载这个压缩文件,心里暗暗窃喜,这不是省事了吗,结果清空筛选条件发现是后端放开了对token的校验,一旦恢复校验接口马上就报错了,而实际线上环境这样做显然是不安全的,不可能让后端放开校验,而出现这种情况的原因是在原页面发了一次请求,打开新页面又发了一次请求,原页面在请求头中设置了token,新开的页面哪有这个东西,着急坏了,想着能不能把token跟着参数一起传过去,后端校验找不到请求头中的token去判断参数里有没有token,后端的回答是:所有请求都要先校验有无token!!!前端下载zip文件流,vue.js,前端,javascript

 

这就很麻烦了,老老实实处理流吧QAQ

各种查各种找,经过很多无用尝试(当磨炼心态了)结果得出的结论:

步骤1:

接口代码(注意设置responseType和headers):

export function searchPersonnelHousInfoExport(query) {
    return request({
      baseUrl: '/api-login',
      url: '/miniadmin/personnelHous/searchPersonnelHousInfoExport',
      method: 'GET',
      params: query,
      responseType: 'blob', //注意
      headers: {            //注意
        'Content-Type': 'application/json; application/octet-stream'
      }
    })
  }

步骤2:

调用接口:

async exportex(){
      let postData = {
        current: this.currentPage,
        size: this.pageSize
      }
      let res = await searchPersonnelHousInfoExport(postData)
      let blob = new Blob([res.data], { type: 'application/zip' }); //设置下载的内容以及格式
      const url = window.URL.createObjectURL(blob); //设置路径
      const link = window.document.createElement('a'); // 创建a标签
      link.href = url;
      let filename = res.headers['content-disposition']
        .split(';')[1]
        .split('filename=')[1]
      let decodedURL = decodeURIComponent(filename); //解码,返回的是文件流所以我从res.header里面拿的文件名,但是是编码后的%E4巴拉巴拉的,所以拿来用的话要在前端解码
      link.download = decodedURL; //设置文件名
      link.style.display = 'none';
      link.click();
      console.log(link,'res')

      URL.revokeObjectURL(url);
}

结果:真的下载到了.zip压缩文件了!兴高采烈的打开,结果傻眼了:能拿到压缩文件,解压后却不是excel文件,当时我的心,拔凉拔凉的啊,但是这边排期还有不到两天了,没办法,搜解决办法吧

。。。。。漫长的一天多。。。。。。

终于在搜的头晕眼花口吐白沫甚至想到iframe嵌套往里塞地址和请求头之后找到了一个不一样的结论:mock模块会影响原生的ajax请求,使得服务器返回的blob类型变成乱码

瞬间虎躯一震,来到main.js一看:

// 全局 Mock 接口
import './mock'

赶紧试试,立马把引入注释了:

前端下载zip文件流,vue.js,前端,javascript

我滴妈啊,终于解决了,当时热泪盈眶,因为这个乱码问题困扰我一天半了,mock火速滚出我的电脑!文章来源地址https://www.toymoban.com/news/detail-772183.html

到了这里,关于前端调接口下载(导出)后端返回.zip压缩文件流(的坑!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端下载文化部几种方法(excel,zip,html,markdown、图片等等)和导出 zip 压缩包

    使用 后端的设置 Content-Type: application/octet-stream(下载用的流) 使用导出 zip 如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端或者对python感兴趣的朋友,请多多关注💖💖💖,咱们一起探讨和努力!!! 👨‍🔧 个人主页 : 前端初见

    2024年02月14日
    浏览(52)
  • 纯前端 导出Excel文件(包括导出用数组数据模拟文件数据和实际后端返回的文件数据)的 方法

            在纯前端导出文件的一种常见方法是通过生成下载链接来实现,可以使用Blob对象和URL.createObjectURL()方法来实现,因为现在工作中主要运用的前端框架是Angular,这篇文章将以angular为例进行阐述。 一、示例代码 1. 首先,安装FileSaver库(https://github.com/eligrey/FileSaver.j

    2024年04月23日
    浏览(36)
  • js将后端返回的文件流导出为excel,并自定义下载文件名

    一. 需求 后台管理系统,常会出现导出excel表格功能;点击导出按钮,请求后端接口,需要将接口返回的 文件流 导出为excel,实现前端下载excel文件。 但是,返回的数据获取 response 时出现乱码,如图: 二. 实现思路 调用后端下载接口,获取传递过来的二进制数据流 创建 a 标

    2024年02月05日
    浏览(83)
  • 后端返回base64文件前端如何下载

    1.后端返回base64格式文件 2.前端代码 3.请求封装

    2024年02月05日
    浏览(62)
  • 前端处理后端返回的文件流,进行文件下载

    二进制流格式  Blob格式 前言:         需求:根据后端接口返回的文件流进行数据处理,并实现文件的下载,且下载文件为word文档. 封装下载文件接口: 最开始没带 responseType:\\\"Blob\\\" ,进行文件下载后,里面的内容全部是乱码!!! 代码实现:  知识点补充:         1、n

    2024年02月07日
    浏览(60)
  • 前端基于axios请求下载文件(后端返回Blob文件流)

    前端小白第一篇csdn文章就当自己记录学习啦! 我自己遇到的情况写在前面防止有人和我不一样,浪费时间浏览; 调用下载接口后端给我返回的数据格式(即文件流格式)如下: 1.按钮定义点击事件 2.调用后端接口 在使用 axios 请求下载文件 api 接口时,注意区分不同请求方法

    2024年02月11日
    浏览(64)
  • Java后端向前端返回文件流——实现下载功能!

    前端实现文件下载功能有多种方法,这里就不一一介绍,这里只介绍使用文件流下载的实现方法。 既然是文件流那就肯定需要给前端返回一堆二进制编码,作为后端就可以返回一个 OutPutStream 后端可以使用Java中servlet提供的 HttpServletResponse ,核心步骤是要设置响应的数据类型

    2024年02月08日
    浏览(46)
  • Java后端向前端返回文件流——实现下载功能

    前端实现文件下载功能有多种方法,这里就不一一介绍,这里只介绍使用文件流下载的实现方法。 既然是文件流那就肯定需要给前端返回一堆二进制编码,作为后端就可以返回一个 OutPutStream 后端可以使用Java中servlet提供的 HttpServletResponse ,核心步骤是要设置响应的数据类型

    2024年02月11日
    浏览(49)
  • 后端接口返回文件流格式、前端如何实现文件下载导出呢?

    在项目开发过程中,难免会需要实现文件下载功能,记录下自己实际开发过程过程中遇到两种实现的方式。一种:后端直接返回加密url ,前端解密后直接使用 a标签下载就可以,这种方法相等比较简单,另一种:后端接口直接返回文件流,这种方式前端就需要单独封装对应的

    2024年02月16日
    浏览(48)
  • 【前端】根据后端返回的url进行下载并设置文件下载名称

            在我们项目当中存储文件是存储到厂商的服务器上的,然后厂商返回一个可以直接下载url地址,但是前端使用这个url下载的时候永远都是保存一个名字,这时候我们就需要设置文件保存的名称,         那么如何实现呢?使用了fetch将url转换成了blob即可。 代码

    2024年02月04日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包