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

下面是详细讲解“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日

相关文章

  • vue2.0 datepicker使用方法

    Vue2.0 Datepicker使用方法 简介 Vue2.0 Datepicker是一个基于Vue2.0和moment.js的日期选择器组件,它可以帮助你方便地选择日期并将所选日期返回给你的应用程序。 安装 安装Vue2.0 Datepicker很简单,只需要使用npm命令即可: npm install vue2-datepicker –save 使用 …

    Vue 2023年5月29日
    00
  • 基于vue-resource jsonp跨域问题的解决方法

    基于vue-resource进行跨域请求时会存在一些问题,其中最常见的就是会因为浏览器同源策略的限制而导致请求失败。为了解决这个问题,可以使用JSONP技术进行跨域请求。 JSONP是什么? JSONP(JSON with padding)是一种前端跨域解决方案。 JSONP的原理是利用 script 标签没有跨域限制这个特性。例如在本地jsp向http:/…

    Vue 2023年5月28日
    00
  • 详解Vue2.0组件的继承与扩展

    详解Vue2.0组件的继承与扩展 Vue.js是一个流行的MVVM框架,它提供了组件化的开发方式,可以帮助我们更好地组织和封装代码。在Vue.js中,组件的继承和扩展是非常常见的需求。本篇文章将深入探讨Vue2.0组件的继承和扩展,包括继承和扩展的实现方法以及应用场景。 组件的继承 在Vue.js中,我们可以使用extend方法来创建新的组件,这也就是组件的…

    Vue 2023年5月28日
    00
  • 解决vue init webpack 下载依赖卡住不动的问题

    当使用vue-cli的模板生成器vue init webpack脚手架时,有时在安装依赖包的时候会卡在某个包上不动,导致整个过程无法继续。这种情况可能是由于网络问题、依赖版本冲突等多种原因造成的,以至于我们无法轻易判断出原因。但是,我们可以有一些解决办法来尝试解决这个问题。 下面是解决vue init webpack下载依赖卡住不动的问题的完整攻略: 1.更…

    Vue 2023年5月27日
    00
  • vue计算属性及使用详解

    Vue计算属性及使用详解 在Vue中,有一种非常有用的概念:计算属性。在本篇文章中,我将详细解释Vue计算属性的概念及其使用方法,并给出一些示例说明。 什么是Vue计算属性? 计算属性本质上是一个函数,它可以监听Vue实例中的数据变化,并根据数据的变化返回一个新的计算结果。我们使用计算属性来简化Vue模板中复杂的计算逻辑,提高代码的可读性和可维护性。 计算属…

    Vue 2023年5月28日
    00
  • Vue项目中常用的工具函数总结

    下面是“Vue项目中常用的工具函数总结”的攻略: Vue项目中常用的工具函数总结 什么是工具函数 在Vue项目中,我们会经常用到一些通用的、可重复使用的代码片段,这些代码片段被封装成了函数,我们称之为工具函数。通过使用这些函数,我们可以简化代码、提高开发效率、减少出错几率。 常用的工具函数 1.深度复制对象 在Vue项目中,我们经常需要将对象进行深度复制(也…

    Vue 2023年5月27日
    00
  • vue自定义指令限制输入框输入值的步骤与完整代码

    自定义指令是Vue.js提供的一项特性,可以通过自定义指令来扩展Vue.js的原生功能。在输入框中限制输入的内容是一个较为常见的功能,而自定义指令可以实现该功能,并使得代码更加模块化、可重用。下面是实现该功能的步骤和完整代码。 创建指令 首先,我们需要通过Vue.directive方法来创建一个自定义指令。在该方法中,我们需要指定指令名称,并提供一个钩子函数…

    Vue 2023年5月27日
    00
  • Vue页面骨架屏注入方法

    Vue页面骨架屏注入方法是一种性能优化的策略,可以让页面在加载数据的过程中显示出一个占位符,给用户提供更好的体验。下面是一个石乐志的攻略,包含具体的流程和示例说明。 步骤一:安装骨架屏插件 首先,你需要安装一个 Vue 骨架屏插件。我们推荐使用 vue-skeleton-webpack-plugin 或 page-skeleton-webpack-plugi…

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