springboot中Excel文件下载踩坑大全

 更新时间:2021年07月08日 15:05:35   作者:斗者_2013  
本文主要介绍了springboot中Excel文件下载,但是却容易遇到很多坑,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下

项目场景:Spring boot文件下载

调用接口下载spring boot工程的resources目录下的excel模板文件,非常常见的一个文件下载功能,但是却容易遇到很多坑,下面总结记录下。

问题一:下载的文件名称出现中文乱码的问题

解决方案:

response.setHeader("Content-Disposition",
                "attachment;filename=" + new String("下载模板".getBytes("UTF-8"), "ISO8859-1"));

说明:
这是网上最常见的解决方案,经过这样的修改后,在浏览器上调用get请求下载的文件确实没有出现文件名中文乱码了。
但是在swagger里面测试接口,下载的问题还是会出现中文乱码。

问题二:在swagger中测试下载接口,点击下载的文件,发现文件名是乱码的问题

这里我项目中使用的是springdoc-openapi-ui 1.5.9,基于的是openapi3.0的协议。
整体使用方式和界面和swagger类似。

swagger中下载的文件,点击开发后,文件名乱码问题:

在这里插入图片描述

解决方案:

response.setHeader("Content-Disposition", "attachment;fileName=" + 
URLEncoder.encode("线索导入模板.xlsx","utf8"));

说明:
通过URLEncoder.encode函数对文件名称处理后,无论是在浏览器调用GET请求下载文件,还是Swagger中调用下载接口,都不会出现文件名乱码问题。

问题三:下载的excel文件打开时总是提示部分内容有问题,尝试恢复。

在这里插入图片描述

在这里插入图片描述

解决办法:
给response的Header设置大小:

/加上设置大小 下载下来的excel文件才不会在打开前提示修复
response.addHeader("Content-Length",String.valueOf(file.length()));

问题四:开发环境下载成功,打成jar包发布到服务器上部署就出现下载失败问题

原因:
Resource下的文件是存在于jar这个文件里面,在磁盘上是没有真实路径存在的,它其实是位于jar内部的一个路径。所以通过ResourceUtils.getFile或者this.getClass().getResource("")方法无法正确获取文件。

解决:
通过ClassPathResource读取文件流

 ClassPathResource classPathResource = new ClassPathResource("template/template.xlsx");

完整代码

1、控制层代码

@Operation(summary = "下载模版",description = "下载模版")
@GetMapping("/download")
public void download(HttpServletResponse response){
    templateService.download(response);
}

2、下载方法实现

/**
 * 下载线索模板
 * @param response
 */
public void download(HttpServletResponse response) {
    InputStream inputStream = null;
    BufferedInputStream bis = null;
    OutputStream outputStream = null;
    try {
        ClassPathResource classPathResource = new ClassPathResource("template/template.xlsx");
        inputStream = classPathResource.getInputStream();

        response.setContentType("application/octet-stream");
        response.setHeader("content-type", "application/octet-stream");
        //待下载文件名
        String fileName = URLEncoder.encode("模板.xlsx","utf8");
        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
        //加上设置大小 下载下来的excel文件才不会在打开前提示修复
        response.addHeader("Content-Length",String.valueOf(classPathResource.getFile().length()));

        byte[] buff = new byte[1024];
        outputStream = response.getOutputStream();
        bis = new BufferedInputStream(inputStream);
        int read = bis.read(buff);
        while (read != -1) {
            outputStream.write(buff, 0, buff.length);
            outputStream.flush();
            read = bis.read(buff);
        }
    } catch ( IOException e ) {
        log.error("文件下载失败,e");
    } finally {
        IOUtils.closeQuietly(outputStream);
        IOUtils.closeQuietly(inputStream);
        IOUtils.closeQuietly(bis);
    }
}

参考:https://blog.csdn.net/Hi_Boy_/article/details/107198371

到此这篇关于springboot中Excel文件下载踩坑大全的文章就介绍到这了,更多相关springboot Excel文件下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用 Spring Boot 内嵌容器 Undertow创建服务器的方法

    使用 Spring Boot 内嵌容器 Undertow创建服务器的方法

    Undertow是一个非常轻量并高性能的web server,它来自 JBoss。支持blocking和non-blocking两种NIO API。接下来通过本文给大家介绍使用Spring Boot 内嵌容器 Undertow创建服务器的方法,感兴趣的朋友一起看看吧
    2017-11-11
  • Java多线程并发编程 Synchronized关键字

    Java多线程并发编程 Synchronized关键字

    现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的同步锁,同时,线程 B 也去调用 Test 的 synchronized 方法,此时线程 B 无法获得 Test 的同步锁,必须等待线程 A 释放 Test 的同步锁才能获得从而执行对应方法的代码
    2017-05-05
  • Java如何将若干时间区间进行合并的方法步骤

    Java如何将若干时间区间进行合并的方法步骤

    这篇文章主要介绍了Java如何将若干时间区间进行合并的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 深入理解Java8新特性之接口中的默认方法和静态方法

    深入理解Java8新特性之接口中的默认方法和静态方法

    从Java8开始,程序允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。默认方法在接口中可以添加多个,并且Java8提供了很多对应的接口默认方法,接下来让我们一起来看看吧
    2021-11-11
  • socket编程时的发送与接收数据时的问题解析

    socket编程时的发送与接收数据时的问题解析

    这篇文章主要为大家介绍了socket编程时的发送与接收数据时的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 玩转spring boot MVC应用(2)

    玩转spring boot MVC应用(2)

    玩转spring boot,如何快速搭建一个MCV程序?这篇文章为大家详细主要介绍了一个MCV程序的快速搭建过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Java打印九九乘法表代码详情

    Java打印九九乘法表代码详情

    这篇文章主要介绍了Java打印九九乘法表,使用了双重for循环,使用do{}while()实现打印九九乘法表这些好玩的语法实现,感兴趣的小伙伴可参考下面文章内容
    2021-09-09
  • 教你利用SpringBoot写一个属于自己的Starter

    教你利用SpringBoot写一个属于自己的Starter

    如果我们将可独立于业务代码之外的功配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,SpringBoot为我们完成自动装配,简直不要太爽,这篇文章主要给大家介绍了关于如何利用SpringBoot写一个属于自己的Starter,需要的朋友可以参考下
    2022-03-03
  • Java中JDom解析XML_动力节点Java学院整理

    Java中JDom解析XML_动力节点Java学院整理

    JDOM是一种解析XML的Java工具包。DOM适合于当今流行的各种语言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。下面通过本文给大家介绍Java中JDom解析XML的方法,感兴趣的朋友一起学习吧
    2017-07-07
  • java扩展Hibernate注解支持java8新时间类型

    java扩展Hibernate注解支持java8新时间类型

    这篇文章主要介绍了java扩展Hibernate注解支持java8新时间类型,需要的朋友可以参考下
    2014-04-04

最新评论