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 FRAMEWORK BEAN作用域和生命周期原理解析

    SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    这篇文章主要介绍了SPRING FRAMEWORK BEAN作用域和生命周期原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • idea maven 经常主目录自动变回默认的解决方法

    idea maven 经常主目录自动变回默认的解决方法

    很多朋友反映idea maven 经常主目录自动变回默认,遇到这样的问题真的很头疼,该如何解决呢?下面小编给大家介绍下idea maven目录变回默认的解决方法,需要的朋友可以参考下
    2022-08-08
  • idea中自动生成Java类图和时序图的图文教程

    idea中自动生成Java类图和时序图的图文教程

    本文主要介绍了idea中自动生成Java类图和时序图的图文教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java fastdfs客户端使用实例代码

    java fastdfs客户端使用实例代码

    这篇文章主要介绍了java fastdfs客户端使用实例代码,简单介绍了FastDFS的概念和架构,然后分享了实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Spring Data JPA关系映射@OneToOne实例解析

    Spring Data JPA关系映射@OneToOne实例解析

    这篇文章主要为大家介绍了Spring Data JPA关系映射@OneToOne实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • mybatis框架order by作为参数传入时失效的解决

    mybatis框架order by作为参数传入时失效的解决

    这篇文章主要介绍了mybatis框架order by作为参数传入时失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 浅析JDBC的使用方法

    浅析JDBC的使用方法

    这篇文章主要介绍了JDBC的使用方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • 如何利用Spring的@Import扩展点与spring进行无缝整合

    如何利用Spring的@Import扩展点与spring进行无缝整合

    这篇文章主要介绍了如何利用Spring的@Import扩展点与spring进行无缝整合的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ)

    详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ)

    这篇文章主要介绍了详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Mybatis的入门示例代码

    Mybatis的入门示例代码

    首先新建一个JavaWeb项目并导入mybatis依赖的jar包,同时Mybatis是对数据库的操作所以我们需要在数据库中新建一个表user用来演示。下面通过本文给大家详细介绍Mybatis的入门示例代码,感兴趣的朋友一起看看吧
    2016-11-11

最新评论