vue后端传文件流转化成blob对象,前端点击下载返回undefined问题

首先,问题的原因是因为没有正确获取服务端传回的文件流,导致在前端的blob对象中无法处理正确的文件数据。此时,我们需要采用axios响应拦截器的方式进行解决。

步骤如下:

步骤一:后端返回流数据

在后端返回的接口中,返回的数据应为二进制流,如下示例:

@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile() throws IOException {
    File file = new File("path/to/file");

    byte[] fileBytes = Files.readAllBytes(file.toPath());

    HttpHeaders headers = new HttpHeaders();
    headers.setContentDispositionFormData("attachment", file.getName());
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

    return new ResponseEntity<>(fileBytes, headers, HttpStatus.OK);
}

通过以上代码我们可以获取到文件的byte[]数组,并且将文件进行下载,由于返回二进制数据,因此前端无法直接解析,需要后续处理。

步骤二:前端发起下载请求,获取二进制流

我们可以通过axios在前端发起文件下载的请求并获取到返回的二进制流

const downloadFile = async () => {
  try {
    const response = await axios.get('http://localhost:8080/download', {
      responseType: 'blob'
    });

    let blob = new Blob([response.data], { type: 'application/vnd.ms-excel' });
    let url = window.URL.createObjectURL(blob);
    let link = document.createElement('a');
    link.href = url;
    link.download = 'file.xlsx';
    link.click();
  } catch (error) {
    console.error(error);
  }
}

上述代码使用了axios下载文件时特有的responseType字段,用于指定返回的数据类型为二进制流,然后利用Blob对象对数据进行处理,并且使用a标签进行下载操作。

步骤三:在axios响应拦截器中处理二进制流

在前端获取到二进制流之后,因为返回的数据是在axios的后台处理,所以我们需要在axios的响应拦截器中对后台返回的二进制流数据进行处理。示例代码如下:

axios.interceptors.response.use((res) => {
  if (res.headers['content-type'].indexOf('application/octet-stream') >= 0) {
    let blob = new Blob([res.data], {
      type: 'application/octet-stream'
    });
    res.data = blob;
  }
  return res;
})

在响应拦截器中进行判断,如果返回内容的名称为二进制流类型,即content-type为application/octet-stream的时候,就可以处理response.data变成了二进制数组,而不是undefined.

以上就是本题目的完整攻略,你可以在你的代码里按上述发方法操作,看能不能解决你的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue后端传文件流转化成blob对象,前端点击下载返回undefined问题 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 使用Vue.set()方法实现响应式修改数组数据步骤

    使用Vue.set()方法实现响应式修改数组数据,可以确保视图与数据的同步更新。下面是实现步骤: 引入Vue 在使用Vue.set()方法之前,需要先在项目中引入Vue.js。可以通过script标签引入,也可以通过webpack等构建工具引入。 定义数据 假设要在Vue组件中使用一个数组todos: data() { return { todos: [ {…

    Vue 2023年5月28日
    00
  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)

    下面是详细的攻略。 Spring boot + MyBatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一) 实现目标 本项目旨在演示如何使用 Spring boot + MyBatis + Vue.js + ElementUI 构建一个简单的增删改查系统。项目实现的功能包括: 显示数据列表 新增数据 删除数据 修改数据 筛选数…

    Vue 2023年5月29日
    00
  • vue自定义指令directive的使用方法

    下面是关于Vue自定义指令的使用方法的完整攻略。 什么是Vue自定义指令? Vue.js提供的自定义指令可以让开发者注册全局或局部的指令,用于根据应用需求自定义HTML元素的行为。Vue自定义指令提供了一种机制,使开发者可以向DOM元素添加特殊行为,例如输入格式,延迟加载,自动聚焦等等。 自定义指令的使用方法 全局注册指令 可以通过Vue.directive…

    Vue 2023年5月27日
    00
  • Vue计算属性实现成绩单

    下面就让我来详细讲解“Vue计算属性实现成绩单”的完整攻略。 什么是计算属性? 计算属性是一种Vue组件中的一个特殊属性,它的值是由多个数据属性计算得到的结果。它会根据依赖的属性值自动更新,而不必手动调用函数进行更新。 在Vue组件中,我们常常需要对多个数据属性进行一些计算,比如对学生的各科成绩进行累加并计算平均分。如果使用多个watch函数来监听数据变化,…

    Vue 2023年5月28日
    00
  • 详解vue 数组和对象渲染问题

    详解vue 数组和对象渲染问题 在使用Vue进行数据绑定时,数组和对象是常用的数据类型。本文将对Vue数组和对象的渲染问题进行详尽的讲解,并提供两条示例说明,以帮助读者快速掌握数组和对象的渲染方法。 数组渲染 数组渲染是Vue中常见的数据绑定方式,常用的渲染方法有v-for和v-if。v-for可用于渲染数组中所有元素,而v-if则可用于根据数组元素的值来判…

    Vue 2023年5月28日
    00
  • vue微信分享的实现(在当前页面分享其他页面)

    下面我来详细讲解一下在Vue项目中实现微信分享的方法。 首先,我们需要在index.html中加入微信js-sdk的引入: <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> 然后,在项目中新建一个工具类,命名为wechat.…

    Vue 2023年5月27日
    00
  • vue 内置过滤器的使用总结(附加自定义过滤器)

    下面是详细讲解“vue 内置过滤器的使用总结(附加自定义过滤器)”的完整攻略,过程中将给出两个示例来说明。 1. vue 内置过滤器 Vue 提供了一些内置的过滤器,用于快速展示数据的不同格式。这些过滤器可以在插值表达式和 v-bind 指令中使用。 1.1 文本格式化 {{message | capitalize}}: 将信息的第一个字母大写。 {{mes…

    Vue 2023年5月27日
    00
  • vue2路由基本用法实例分析

    Vue2路由基本用法实例分析 Vue是一款流行的JavaScript框架,其配套的Vue Router提供了路由管理功能,使得前端开发变得更加简单和灵活。本文将介绍Vue2路由的基本用法,帮助读者快速了解Vue Router的基本概念和用法。 安装和引入 使用Vue Router需要在Vue的基础上额外安装并引入Vue Router。可以通过npm或CDN引…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部