Vue实现点击按钮下载文件的操作代码(后端Java)

yizhihongxing

下面是详细讲解“Vue实现点击按钮下载文件的操作代码(后端Java)”的完整攻略:

1. 前端实现

1.1 创建下载按钮

首先,在Vue的组件中添加一个按钮,用来触发下载操作:

<template>
  <div>
    <button @click="downloadFile">下载文件</button>
  </div>
</template>

1.2 实现下载功能

在按钮的点击事件中,通过axios请求后端接口来下载文件,代码如下:

<script>
import axios from 'axios'

export default {
  data() {
    return {
      url: '/api/download'
    }
  },
  methods: {
    downloadFile() {
      axios.get(this.url, {
        responseType: 'blob'
      }).then(res => {
        const link = document.createElement('a')
        const blob = new Blob([res.data])
        link.style.display = 'none'
        link.href = URL.createObjectURL(blob)
        link.setAttribute('download', 'file.jpg')
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
      })
    }
  }
}
</script>

其中,responseType: 'blob'表示返回的数据是一个二进制流,用Blob对象接收,后面的代码就是先将响应结果(文件)转为Blob格式,然后创建一个a标签,设置下载地址、文件名,并模拟点击来触发下载。

2. 后端实现

2.1 编写下载接口

后端使用Java编写,我们需要实现一个能够返回文件内容的接口:

@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {
  // 从文件系统中读取文件内容,假设文件为 D:/test.jpg
  File file = new File("D:/test.jpg");
  FileInputStream fis = new FileInputStream(file);
  // 设置响应头,告诉浏览器返回的是文件数据
  response.setContentType("application/octet-stream");
  response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");
  // 将文件内容写入响应流
  IOUtils.copy(fis, response.getOutputStream());
  response.flushBuffer();
}

以上代码中,我们使用FileInputStream从文件系统中读取文件内容,并将响应头设置为application/octet-stream,表示返回的是二进制流,浏览器会自动弹出文件下载对话框。

2.2 处理跨域请求

如果Vue与后端不在同一域名下,前端的请求会出现跨域问题。我们可以通过CORS来解决跨域问题,具体实现如下:

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*");
    }
}

以上代码中,我们添加了一个CORS的全局配置,表示允许所有域名的请求,并支持所有HTTP方法和所有请求头。

3. 示例说明

下面是两个示例,一个是下载 Excel 文件,一个是下载 PDF 文件。

3.1 示例1 - 下载Excel文件

前端代码:

<template>
  <div>
    <button @click="downloadFile">下载 Excel 文件</button>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  data() {
    return {
      url: '/api/download/excel'
    }
  },
  methods: {
    downloadFile() {
      axios.get(this.url, {
        responseType: 'blob'
      }).then(res => {
        const link = document.createElement('a')
        const blob = new Blob([res.data])
        link.style.display = 'none'
        link.href = URL.createObjectURL(blob)
        link.setAttribute('download', 'file.xlsx')
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
      })
    }
  }
}
</script>

后端代码:

@GetMapping("/download/excel")
public void downloadExcel(HttpServletResponse response) throws IOException {
  // 从文件系统中读取文件内容,假设文件为 D:/test.xlsx
  File file = new File("D:/test.xlsx");
  FileInputStream fis = new FileInputStream(file);
  // 设置响应头,告诉浏览器返回的是文件数据
  response.setContentType("application/octet-stream");
  response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");
  // 将文件内容写入响应流
  IOUtils.copy(fis, response.getOutputStream());
  response.flushBuffer();
}

3.2 示例2 - 下载PDF文件

前端代码:

<template>
  <div>
    <button @click="downloadFile">下载 PDF 文件</button>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  data() {
    return {
      url: '/api/download/pdf'
    }
  },
  methods: {
    downloadFile() {
      axios.get(this.url, {
        responseType: 'blob'
      }).then(res => {
        const link = document.createElement('a')
        const blob = new Blob([res.data])
        link.style.display = 'none'
        link.href = URL.createObjectURL(blob)
        link.setAttribute('download', 'file.pdf')
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
      })
    }
  }
}
</script>

后端代码:

@GetMapping("/download/pdf")
public void downloadPdf(HttpServletResponse response) throws IOException {
  // 从文件系统中读取文件内容,假设文件为 D:/test.pdf
  File file = new File("D:/test.pdf");
  FileInputStream fis = new FileInputStream(file);
  // 设置响应头,告诉浏览器返回的是文件数据
  response.setContentType("application/octet-stream");
  response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");
  // 将文件内容写入响应流
  IOUtils.copy(fis, response.getOutputStream());
  response.flushBuffer();
}

以上就是“Vue实现点击按钮下载文件的操作代码(后端Java)”的完整攻略,希望能帮助到您。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue实现点击按钮下载文件的操作代码(后端Java) - Python技术站

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

相关文章

  • Vue登录功能实现全套详解(含封装axios)

    关于“Vue登录功能实现全套详解(含封装axios)”的完整攻略,我将为你进行详细讲解。 1. 概述 本文将从以下方面讲解Vue登录功能的实现: Vue项目的创建和初始化; Vue路由的配置; Vue组件的编写; 使用axios封装HTTP请求; 进行登录验证。 2. Vue项目的创建和初始化 首先,我们需要使用Vue-CLI创建一个Vue项目,并且初始化项…

    Vue 2023年5月28日
    00
  • vue 组件开发原理与实现方法详解

    Vue 组件开发原理与实现方法详解 Vue 组件是 Vue.js 中的一个重要概念,允许我们将一个页面拆分成多个独立的、可复用的部分,并且每个组件拥有自己的数据、样式和行为。组件化开发大大提高了应用程序的可维护性和可扩展性。 本文将从以下三个方面介绍 Vue 组件开发的原理和实现方法: 组件的基本原理 组件的实现方法 Vue 组件的使用示例 一、组件的基本原…

    Vue 2023年5月27日
    00
  • Springboot Vue可配置调度任务实现示例详解

    下面我将为您详细讲解“Springboot Vue可配置调度任务实现示例详解”的完整攻略。 简介 本攻略将介绍如何使用Springboot和Vue实现可配置调度任务,主要涵盖以下内容: 何为可配置调度任务 实现可配置调度任务的技术选型 实现步骤和示例说明 什么是可配置调度任务 可配置调度任务是指可以根据用户需求动态添加、修改、删除的定时任务,而不需要每次都手…

    Vue 2023年5月28日
    00
  • vue 之 css module的使用方法

    我来给你详细讲解一下“vue之CSS Module的使用方法”的完整攻略。 1. 什么是CSS Module CSS Module是CSS的一种模块化方案,与其它CSS的模块化方案如Sass、Less等不同的是,它是由JavaScript模块化方案驱动的,而不是依赖于编译器或预处理器。CSS Module可以帮助我们解决CSS全局污染的问题,让我们的CSS样…

    Vue 2023年5月28日
    00
  • 使用 Jest 和 Supertest 进行接口端点测试实例详解

    使用 Jest 和 Supertest 进行接口端点测试是一种常见的自动化测试方式,有助于提高开发和测试效率,以下是具体的实例攻略。 准备工作 在开始测试之前,我们需要先安装相关的环境和库,具体包括: 安装 Node.js 在 Node.js 官网 https://nodejs.org/en/ 上下载对应的版本并安装。 创建项目 在命令行中通过 npm 命令…

    Vue 2023年5月28日
    00
  • vue3中unplugin-auto-import自动引入示例代码

    在Vue3中,为了更加轻松地管理依赖和避免手动导入组件,可以使用unplugin-auto-import插件自动导入组件和其他依赖。下面是如何在Vue3中使用unplugin-auto-import的完整攻略和两个示例说明。 安装和配置unplugin-auto-import 首先,需要安装unplugin-auto-import: npm install …

    Vue 2023年5月28日
    00
  • 基于JWT的spring boot权限验证技术实现教程

    我将为您详细讲解如何实现基于JWT的Spring Boot权限验证技术。 1. JWT 的概念 JWT(JSON Web Token)是一种使用 JSON 格式编写的 token(令牌)标准,并且可被用于浏览器和移动端之间的身份认证。 JWT 由三部分组成:头部(header)、载荷(payload)和签名(signature)。 头部(header):包含…

    Vue 2023年5月28日
    00
  • Vue props用法详解(小结)

    Vue props用法详解(小结) 在Vue中,props是一个常用的属性传递方式。它允许你从父组件向子组件传递数据。 基本用法 父组件中,使用v-bind指令向子组件传递数据。子组件中,定义props属性接收数据。 以下是一个简单的例子: <!– 父组件 –> <template> <div> <child-c…

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