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

yizhihongxing

首先,问题的原因是因为没有正确获取服务端传回的文件流,导致在前端的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 进阶之路(三)

    下面我来为您详细讲解一下“Vue 进阶之路(三)”的完整攻略。 标题 “Vue 进阶之路(三)”的完整攻略主要包含以下内容: 1. Vue的混入 混入是Vue中的一个非常有用的特性,它可以让我们把一个对象的属性、方法等合并到一个Vue组件中。这样做的好处是可以有效地避免多个组件之间的代码冗余。 下面代码展示了如何在Vue中使用混入: const myMixi…

    Vue 2023年5月27日
    00
  • vue实现的请求服务器端API接口示例

    下面我将为你详细讲解“vue实现的请求服务器端API接口示例”的完整攻略。 1. 准备工作 在开始实现“vue实现的请求服务器端API接口示例”之前,需要做一些准备工作: 确定需要请求的API接口地址:这个可以向后端开发人员询问。 安装vue-resource插件:vue-resource是Vue.js官方推荐的插件,用于处理Ajax请求。你可以通过npm安…

    Vue 2023年5月28日
    00
  • Vue实现多标签选择器

    确定需求 首先,我们需要明确自己的需求,即实现一个多标签选择器,让用户能够方便地选择多个标签进行操作。在确定需求的时候,我们需要考虑如下问题: 该多标签选择器需要支持哪些操作,比如添加标签、删除标签、清空标签等等。 该多标签选择器是否需要支持搜索,用户可以搜索标签进行选择。 多标签选择器的样式应该如何设计,方便用户使用。 在确认好需求之后,我们就可以着手开始…

    Vue 2023年5月27日
    00
  • vue中设置滚动条方式

    我来给您详细讲解一下vue中设置滚动条方式的完整攻略,以下是具体步骤: 1. 引入第三方滚动条库 Vue原生并不提供滚动条相关的API,因此我们需要借助第三方库来添加滚动条组件。这里我推荐使用perfect-scrollbar,这是一个轻量级的滚动条插件,使用简单。 我们可以在项目中使用npm安装该插件: npm install perfect-scroll…

    Vue 2023年5月29日
    00
  • vue动画—通过钩子函数实现半场动画操作

    下面我将详细讲解如何通过钩子函数实现 Vue 动画操作的完整攻略。 1. 前置知识 在学习 Vue 动画之前,需要掌握以下基础知识: Vue 的基本使用方法,包括组件、指令等。 Vue 的渲染函数,了解如何通过 render 函数来创建 Vue 组件。 Vue 中的过渡效果,了解如何使用 transition 组件实现动画效果。 2. 动画钩子函数 Vue …

    Vue 2023年5月28日
    00
  • Vue使用vue-pdf实现PDF文件预览

    下面是“Vue使用vue-pdf实现PDF文件预览”的完整攻略。 什么是vue-pdf vue-pdf是一个基于pdf.js的Vue.js PDF查看器。支持多页和加密PDF文件。 实现方式 安装vue-pdf 在终端中运行以下命令安装 vue-pdf:npm install vue-pdf –save 引入vue-pdf 在Vue组件中引入vue-pdf…

    Vue 2023年5月28日
    00
  • vue修改数据页面无效的解决方案

    当我们在使用Vue进行开发时,经常遇到这样的场景:当我们修改了数据,但是页面上并没有反应。这是由于Vue中的数据响应式机制造成的,需要手动触发重新渲染。那么,针对这种情况,我们该如何解决呢?下面介绍几种常见的解决方案。 1. 使用this.$forceUpdate()方法 this.$forceUpdate()方法可以强制Vue实例强制重新渲染,并重新应用到…

    Vue 2023年5月29日
    00
  • vue中的循环遍历对象、数组和字符串

    下面是关于vue中循环遍历对象、数组和字符串的详细攻略。 对象循环遍历 在vue中循环遍历对象可以使用v-for指令,与循环遍历数组类似。下面是一个简单的例子: <ul> <li v-for="(value, key) in obj">{{ key }}: {{ value }}</li> </u…

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