前端下载后端返回的文件流,取请求头中的文件名称

这篇具有很好参考价值的文章主要介绍了前端下载后端返回的文件流,取请求头中的文件名称。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 一、先尝试用普通方法调取后端接口



// 附件下载
export function downloadPdfs(data) {
  return request({
    url: '/organizaitonApproval/downloadWord',
    method: 'post',
    data: data,
    responseType: 'blob', // 需要加blob
  })
}

但是用上面的方法发现只能顺利下载文件,res.headers["content-disposition"] 取不到后端给前端返回的请求头。

通过问题排查发现:

如图,前端需要取的res.headersres.data 是一层的,当拦截器中返回res.data 后,就取不到外层的headers,因此前端要自己写axios请求方法

前端下载后端返回的文件流,取请求头中的文件名称

二、前端单独写axios请求方法


import { getToken } from "@/utils/auth";
import axios from 'axios';
axios.defaults.headers['Authorization'] = 'Bearer ' + getToken();
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';

downloadFile(row) {
      let data={
        orgId: row.orgId
      }
      axios({
          method: 'post',
          url: '/organizaitonApproval/downloadWord',
          data: data,
          responseType: 'blob'
        }).then((res) => {
            // 文件流
            const content = res;
            const blob = new Blob([content]);
            let url = window.URL.createObjectURL(blob);
            let link = document.createElement("a");
            link.style.display = "none";
            link.href = url;

            // 取后端给前端返的请求头中的文件名称
            const temp =res.headers["content-disposition"].split(";")[1].split("filename=")[1];
            console.log("temp:" + temp)
    
            link.download = fileName
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link); //下载完成移除元素
            window.URL.revokeObjectURL(url); //释放掉blob对象
      })
      .catch(error => {
        //console.log(error);
      });
    }

但是前端依旧拿不到 res.headers["content-disposition"] ,如图,headers里面没有content-disposition 属性

前端下载后端返回的文件流,取请求头中的文件名称

继续排查问题,发现后端没有给前端单独塞,需要找后端再改一下

三、后端需要给前端单独塞一个 Content-Disposition


response.setHeader("Access-Control-Expose-Headers","Content-Disposition");

拿到res.headers["content-disposition"] 后,发现此时temp是乱码,需要前端自己转一下。

四、未经过处理,直接拿到后端给前端的乱码filename


%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E8%AE%A1%E5%88%92%E8%A1%A8.docx

五、前端文件乱码的转码方法

1、方法一:安装iconv-lite依赖

(1)下载模块包,使用npm install iconv-lite

(2)在项目中引入iconv-lite

import iconv from ‘iconv-lite’;


let iconv = require('iconv-lite'); 
iconv.skipDecodeWarning = true;//忽略警告
let buf = iconv.decode(temp, 'gdk');
const fileName = iconv.decode(buf, 'utf-8')
console.log('fileName_',fileName)

2、方法二:采用后端java在响应头中的里设置文件名称(URLEncoder.encode)。前端vue,var fileName = decodeURIComponent(fileNameUtf8),进行解码。

前端代码如下:


downloadFile(row) {
      let data={
        orgId: row.orgId
      }
      axios({
          method: 'post',
          url: '/organizaitonApproval/downloadWord',
          data: data,
          responseType: 'blob'
        }).then((res) => {
            // 文件流
            const content = res;
            const blob = new Blob([content]);
            let url = window.URL.createObjectURL(blob);
            let link = document.createElement("a");
            link.style.display = "none";
            link.href = url;

            // 取后端给前端返的请求头中的文件名称
            const temp =res.headers["content-disposition"].split(";")[1].split("filename=")[1];
            const fileName = decodeURIComponent(temp)
            console.log("fileName:" + fileName)
    
            link.download = fileName
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link); //下载完成移除元素
            window.URL.revokeObjectURL(url); //释放掉blob对象
      })
      .catch(error => {
        //console.log(error);
      });
    }

我采用的第二种方法

<** ----------2023-06-16 ---------- *>

【注:方法一的“安装iconv-lite依赖”可能不行,今天想起来这个试了一下,发现依赖引入后,虽然解决了乱码的问题,但是会导致通过原有拦截器的文件下载全部报错,将该依赖卸载后,通过拦截器下载的文件恢复正常。所以最后还是得用方法二】

最后效果:

前端下载后端返回的文件流,取请求头中的文件名称

参考:解决前后端传送文件名,出现乱码问题,URLEncoder_urlencoder.encode 乱码-CSDN博客

axios获得文件流,转为blob,出现部分文件乱码问题解决思路_js请求后端的文件流转为blob之后变了-CSDN博客文章来源地址https://www.toymoban.com/news/detail-429697.html

到了这里,关于前端下载后端返回的文件流,取请求头中的文件名称的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 前端处理后端返回的文件流,进行文件下载

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

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

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

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

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

    2024年02月11日
    浏览(35)
  • 前端调接口下载(导出)后端返回.zip压缩文件流(的坑!)

    前言:基于vue2+element-ui的一个后台管理系统,需求评审要加一个导入导出文件的功能,由于可能导出的数据量过大(几十万条数据),下载时间过长,所以用.zip压缩文件替代excel文件 本人以前也做过导出文件的功能,但是用的方法是后端处理数据然后放到另一个服务器上,前

    2024年02月03日
    浏览(34)
  • 后端返回文件流,前端怎么导出、下载(8种方法可实现)

    在前端导出和下载后端返回的文件流时,可以使用以下几种方法: 使用 window.open() 方法: 在前端使用 window.open() 方法打开一个新的窗口或标签页,并将后端返回的文件流作为URL传递给该方法。浏览器会自动下载该文件。 例如: window.open(\\\'http://example.com/download\\\', \\\'_blank\\\'); 使用

    2024年02月11日
    浏览(45)
  • 前端发送请求获取后端文件,并且前端实现下载文件功能

    最近遇到一个需求,就是前端发送post请求获取后端的excel文件,并且前端实现下载导出到本地的功能。 前端页面就长上面那样,一个批量导出功能,用户勾选之后,前端通过接口把id和其他的参数传给后端,接口调用方法这里需要注意的是,这里必须设置responseType: ‘blob’

    2024年02月09日
    浏览(32)
  • 前端实现文件下载的方法;以及后端返回 blob 文件流,进行展示。

    前端下载一般分为两种情况,一种是后端直接给一个文件地址,通过浏览器打开就可以下载,另外一种则需要发送请求,后端返回二进制流数据,前端解析流数据,生成URL,实现下载。 通过a标签的download属性来实现文件下载,这种方式是最简单的,也是比较常用的方式,先来

    2024年02月06日
    浏览(35)
  • Vue实战【后端返回文件流时,前端如何处理并成功下载流文件】

    哈喽小伙伴们,在我们日常工作当中,大家一定会遇到 文件导出 这样的功能需求点;导出功能前端后端都可以实现,通常情况下呢是由我们后端同事去处理的,那么当我们后端同事给你返回文件流的时候,前端要怎么处理并且完成下载呢?今天就给大家说个简单的方法,我

    2024年02月11日
    浏览(29)
  • vue 后端返回二进制流-前端通过blob对象下载文件-图片

    前言 在实际开发中我们经常会遇见下载文件的场景,比如下载合同,下载文件 下载文件有2种方式,一种是后端返回二进制流,前端通过blob对象接受根据不同类型下载 还有一种把地址直接在浏览器新窗口打开浏览器打开pdf可以预览和下载,其他文件直接下载 但不管是那种方

    2024年02月05日
    浏览(55)
  • 后端返回可下载的xlsx文件,但是前端接收下载后为乱码

    我的接收数据进行处理的代码为: 确实可以下载下来,但是打开后为乱码。 解决办法: 后端传的是blob类型文件,所以前端接收时也要限制一下类型, 接收的请求代码配置为: 之后再下载就可以正确显示啦

    2024年02月12日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包