文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

后端接口返回文件流格式、前端如何实现文件下载导出呢?

2023-09-02 11:09

关注

在项目开发过程中,难免会需要实现文件下载功能,记录下自己实际开发过程过程中遇到两种实现的方式。一种:后端直接返回加密url ,前端解密后直接使用 a标签下载就可以,这种方法相等比较简单,另一种:后端接口直接返回文件流,这种方式前端就需要单独封装对应的请求方法进行处理,因为这种方式使用不多,为了方便后续使用加深印象,将解决方法记录下来方便后续查阅。

完整代码

post请求
function postDownload(url, data, fileName) {  return axios({    // 用axios发送post请求    url: preUrl + url, // 请求地址    data, // 参数    method: 'post',    responseType: 'blob',    headers: {      'Content-Type': 'application/json',    },  })    .then((res) => {      // 处理返回的文件流      // 获取http头部的文件名信息,若无需重命名文件,将下面这行删去      if (!fileName) fileName = window.decodeURI(res.headers['content-disposition'].split('=')[1])            const blob = new Blob([res.data], { type: 'application/vnd.ms-excel;charset=utf-8' })            if (window.navigator && window.navigator.msSaveOrOpenBlob) {        window.navigator.msSaveOrOpenBlob(blob, fileName)      } else {                let url1 = window.URL.createObjectURL(blob)        let link = document.createElement('a')        link.style.display = 'none'        link.href = url1        link.setAttribute('download', fileName)        document.body.appendChild(link)        link.click()      }      Message({        message: '导出成功',        type: 'success',      })      return Promise.resolve(res.data)    })    .catch((err) => {      Message({        message: err,        type: 'error',      })      return Promise.resolve(err)    })}
get 请求
function getDownload(url, data, fileName) {  return axios({    // 用axios发送get请求    url:url, // 请求地址    params: data, // 参数    method: 'get',    responseType: 'blob',    headers: {      'Content-Type': 'application/json',    },  })    .then((res) => {      // 处理返回的文件流      // 获取http头部的文件名信息,若无需重命名文件,将下面这行删去      if (!fileName) fileName = window.decodeURI(res.headers['content-disposition'].split('=')[1])            const blob = new Blob([res.data], { type: 'application/vnd.ms-excel;charset=utf-8' })            if (window.navigator && window.navigator.msSaveOrOpenBlob) {        window.navigator.msSaveOrOpenBlob(blob, fileName)      } else {                let url1 = window.URL.createObjectURL(blob)        let link = document.createElement('a')        link.style.display = 'none'        link.href = url1        link.setAttribute('download', fileName)        document.body.appendChild(link)        link.click()      }      Message({        message: '导出成功',        type: 'success',      })      return Promise.resolve(res.data)    })    .catch((err) => {      Message({        message: err,        type: 'error',      })      return Promise.resolve(err)    })}
responseType: ‘blob’ 说明

后端接收返回的二进制文件流,axios 本身不回去处理,但是接口返回的内容浏览器会接收对应的内容,但是接收到的内容是这样的:
二进制文件流
这样的文件无法看懂,因为axios 本身是不做二进制文件流处理的;

这里就需要给 axios 添加 responseType: ‘blob’,

 return axios({    // 用axios发送get请求    url:url, // 请求地址    params: data, // 参数    method: 'get',    responseType: 'blob',    headers: {      'Content-Type': 'application/json',    },  })
获取保存文件名称
// 获取http头部的文件名信息,若无需重命名文件,将下面这行删去if (!fileName) fileName = window.decodeURI(res.headers['content-disposition'].split('=')[1])

可以传入要保存的文件名称,也可以直接获取接口返回的文件名称;

处理下载文件
       const blob = new Blob([res.data], { type: 'application/vnd.ms-excel;charset=utf-8' })            if (window.navigator && window.navigator.msSaveOrOpenBlob) {        window.navigator.msSaveOrOpenBlob(blob, fileName)      } else {                let url1 = window.URL.createObjectURL(blob)        let link = document.createElement('a')        link.style.display = 'none'        link.href = url1        link.setAttribute('download', fileName)        document.body.appendChild(link)        link.click()

因为在测试过程种发现不同浏览从下载有问题,这里做了 ie 内核浏览器和 谷歌、 火狐、浏览器下载处理,实现方式其实也就是使用a 标签的下载数据, 给a标签设置 属性 download
自动执行点击下载,就实现了调用接口后将文件下载导出了!!!!!!!!!!!!!!

来源地址:https://blog.csdn.net/weixin_47659945/article/details/130501545

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯