SpringBoot+Vue下载文件Excel、PDF下载后打不开

下载的文件打不开有多种可能,要先判断出是后端返回的文件有问题还是前端的解析有问题

后端原因:

1、可以尝试用PostMan直接请求后端下载的接口,然后看是否能够打开文件;

2、写个简单的java读取本地文件(Excel或PDF等),然后直接响应前端,看是否正常(防止是后端获取或者生成的文件有问题);

3、判断后端是否存在拦截器等,额外处理了数据(如对响应数据做了统一的包装或者序列化等);

4、尝试改变响应,直接将文件写入到response响应流里或者反回字节数组byte[];

5、多层服务调用,可能某一个服务对数据做了处理

前端原因:

1、前端下载代码写错了(这个可能性比较小,网上一大堆vue下载Excel的方法);

2、可以尝试将请求的responseType改为arraybuffer或者blob(两个都可以试试,一般情况下是两种都可以的);

3、前端响应拦截器里对响应数据做了额外处理(全局搜项目中的interceptors.response.use);

4、mock会影响原生的ajax请求,使后端响应的数据乱码(在dist/mock.js中增加如下代码即可解决:this.custom.xhr.responseType = this.responseType,加到this.custom.xhr.send(data)前一行);

我在项目中遇到了下载的问题,弄了很长时间,都找不到问题所在,各种方法都试了,都不行,最后通过F12在下载的请求里发现的responseType没有值,是空串,才意识到是设置的responseType没有生效。网上查了之后才发现是mock搞得鬼。

然后另一个项目也有下载的问题,解决的mock之后发现还不行,又排查很久发现了是后端的其他服务在调用时将下载的数据做了json化(隐藏的太深了....总以为是前端的工程对响应数据做了额外处理,其实也检查了自己的服务...没在第一时间考虑到其他服务)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Spring Boot + Vue 文件下载可以通过以下步骤实现: 1. 在 Vue 中创建一个下载按钮,当用户点击该按钮时,发送一个请求到后端。 2. 在 Spring Boot 中创建一个 RESTful API,该 API 接收文件下载请求,并返回文件的字节流。 3. 在 Vue 中接收到后端返回的文件字节流后,使用 Blob 对象将其转换为文件,并通过浏览器下载文件。 具体实现细节可以参考以下链接: https://www.baeldung.com/spring-boot-file-download https://www.tutorialspoint.com/vuejs/vuejs_file_download.htm ### 回答2: Spring Boot是一种开源的Java框架,它提供了一个快速搭建Java Web应用程序的方法。Vue.js是一个非常流行的JavaScript框架,它提供了一个高效且易于使用的前端开发平台。在一些复杂的Web应用中,文件下载是必不可少的一个功能,尤其是在网站中提供一些用户需要的PDF、图片、动画或其他二进制文件。本文将会讨论在Spring Boot框架下如何使用Vue.js实现文件下载。 1. 后端实现: 首先,我们需在后端实现下载文件接口。使用Spring Boot框架的话,我们需要建立一个Restful的API接口来实现该功能。具体实现方式如下: @GetMapping(value = "/downloadFile") public ResponseEntity<byte[]> downloadPostmanCollectionFile() throws FileNotFoundException { byte[] fileData = getFileData();//获取文件数据 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF);//设置Content-Type为PDF headers.setContentDispositionFormData("attachment", "test.pdf");//设置响应头信息 headers.setContentLength(fileData.length); return new ResponseEntity<>(fileData, headers, HttpStatus.OK);//返回ResponseEntity对象 } 需要注意的是,我们需要根据实际需求设置Content-Type和对应的文件名。 2. 前端实现: 在Vue.js中实现文件下载功能需要通过发送请求来触发后端服务的下载方法。需要使用axios或者其他类似的网络请求库实现。具体代码如下: methods: { downloadFile () { axios({ method: 'get', url: '/downloadFile', responseType: 'blob' }).then(res => { const url = window.URL.createObjectURL(new Blob([res.data])) const link = document.createElement('a') link.style.display = 'none' link.href = url link.setAttribute('download', 'test.pdf') document.body.appendChild(link) link.click() document.body.removeChild(link) }) } } 在该代码中,我们首先向后端发送请求,后端会返回一个二进制数据流(blob)。我们将数据封装成一个Blob对象,并将其转换为一个URL,然后通过a标签创建一个下载链接,并模拟点击该链接即可实现文件下载。需要注意的是,我们需要根据实际返回的响应格式设置responseType属性。 综上所述,Spring Boot Vue文件下载功能的实现方法就是创建一个Restful后端接口,并在前端使用axios向该接口发送请求,获取文件数据,并将其转换为Blob对象,创建下载链接即可。如果使用Vue.js作为前端框架,可以通过一个函数封装下载的全部过程,实现一键下载的功能。 ### 回答3: Spring Boot Vue文件下载需要在后端代码中构建下载文件接口,同时在前端代码中实现文件下载的功能。以下是具体实现步骤: 1.后端代码实现 在Spring Boot中,需要通过编写Controller的方法来生成下载文件接口。下面是一个简单的示例: ``` @GetMapping("/download") public ResponseEntity<Object> downloadFile() throws IOException { String fileName = "example.txt"; File file = new File(fileName); InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getName())); headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); headers.add("Pragma", "no-cache"); headers.add("Expires", "0"); return ResponseEntity.ok() .headers(headers) .contentLength(file.length()) .contentType(MediaType.parseMediaType("application/octet-stream")) .body(resource); } ``` 该方法首先创建一个文件对象,然后将文件的内容转换成字节流。之后使用ResponseEntity对象返回文件内容,同时设置HTTP头信息,将要下载文件名和类型等信息传递给客户端。 2.前端代码实现 在Vue中,可以使用Axios工具来调用后端的接口,并向接口传递需要下载文件名等参数。下面是一个简单的示例: ``` <template> <button @click="downloadFile">下载文件</button> </template> <script> import axios from 'axios'; export default { name: 'DownloadFileButton', methods: { downloadFile() { axios.get('/download?fileName=example.txt', { responseType: 'blob' }) .then(response => { const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'example.txt'); document.body.appendChild(link); link.click(); document.body.removeChild(link); }) .catch(error => { console.log(error); }) } } } </script> ``` 该示例中,当用户点击“下载文件”按钮时,会调用downloadFile方法。这个方法向服务器发送HTTP请求,请求下载名为“example.txt”的文件。Axios请求的responseType设为‘blob’,以确保服务器返回的数据可以正确处理。接着,在成功处理响应数据后,将响应数据构造成Blob对象并生成一个下载链接,通过设置HTML元素的属性来触发下载操作。 3.总结 通过以上步骤,我们可以实现Spring Boot Vue文件下载的功能。在后端代码中,需要提供文件下载接口,并在返回的HTTP头信息中添加下载文件文件名、文件类型等信息。在前端代码中,需要使用Axios向后端发送请求,并实现下载文件的功能。同时,为了确保下载链接能够被正确处理,需要将响应数据构造成Blob对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值