文章目录

  • 前言
  • 1.问题过程
  • 2. 解决方案
    • 2.1 文件上传

      • 2.2 ClassPathResource
  • 总结

前言

最近的工作中遇到了复杂的excel报表导出业务,采用的是用excel模板来实现该业务(可以规避大量勾画excel格式的代码),将excel的模板放在项目的resources目录,遇到相关的一些问题及解决方案。

1.问题过程

resources目录下模板的位置:

在本地调试时直接用相对路径(templates/xxx.xlsx)就可以获取到对应的模板信息,调试自测过程都非常easy并愉快。
程序打包发到测试环境上,导出excel都是空模板没有任何数据,查看日志发现是在读取resources目录下的模板报错空指针,关键报错日志如下:

java.io.FileNotFoundException: class path resource [templates/scenery.xlsx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/xxx.jar!/BOOT-INF/classes!/templates/xxx.xlsx

从报错信息可以看出来打包(jar)模板的位置和打包之前位置已经不一样了,jar里面也是没有src这个目录,则相对路径去读取模板当然是拿不到的。

2. 解决方案

2.1 文件上传

将resources目录的文件上传到服务器上,不从resources目录下读取模板,有2种方式:

  1. 将文件上传到文件服务(如阿里云OSS),并获取到文件地址,通过流方式读取文件。这种方式需要额外的成本(文件服务器)。
  2. 在jar运行的服务器上创建目录并存放文件,然后程序里读取相对路径。这种方式不太推荐,不可控因素太多(如被误删、服务搬迁等)。

2.2 ClassPathResource

用ClassPathResource读取到resources目录下文件的流,具体代码如下:

            <resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include><include>**/*.yml</include></includes><!--是否替换资源中的属性--><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes><!--是否替换资源中的属性--><filtering>false</filtering></resource>
            ClassPathResource resource = new ClassPathResource("templates/xxx.xlsx");InputStream inputStream = resource.getInputStream();

但是我excel导出是用的easyPOI,模板导出不支持流,必须得是文件的路径,具体实现的代码如下:

/*** 模板报表导出* @param type http* @param data 报表信息*/public static void templateExcelExport(Map<String, Object> data, String type, HttpServletResponse httpServletResponse) throws IOException {//获取模板的位置ReportExcelEnum reportExcelEnum = ReportExcelEnum.valueOf(type);//获取项目的根目录String rootPath = System.getProperty("user.dir");//创建临时的模板存放文件String path = rootPath +"/" + reportExcelEnum.getValue();log.info("存放模板目录及模板文件::"+path);//判断模板是否已存放在文件中File file = new File(path);if(!file.exists()){log.info("不存在则创建文件:"+path);ClassPathResource resource = new ClassPathResource(reportExcelEnum.getValue());InputStream inputStream = resource.getInputStream();saveTempFile(inputStream,file);log.info("模板创建成功!");}//获取模板TemplateExportParams params = new TemplateExportParams(path);//获取到 WorkbookWorkbook workbook = ExcelExportUtil.exportExcel(params, data);//文件名String fileName = reportExcelEnum.getName() + DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now()) + ".xlsx";//导出报表export(httpServletResponse, workbook, fileName);}private static void saveTempFile(InputStream inputStream, File tempFile) throws IOException {//如果文件的目录不存在if(!tempFile.getParentFile().exists()){//创建父目录tempFile.getParentFile().mkdirs();}OutputStream os = new FileOutputStream(tempFile);byte[] b = new byte[2048];int length;while ((length = inputStream.read(b)) > 0) {os.write(b, 0, length);}os.flush();os.close();inputStream.close();}

总结

本篇记录一下读取resources目录下文件问题和解决方案,希望能帮到你。

springboot读取resources目录下文件相关推荐

  1. 如何读取resources目录下的文件路径(九种方式)

    前情提要 本文中提供了九种方式获取resources目录下文件的方式.其中打印文件的方法如下: /*** 根据文件路径读取文件内容** @param fileInPath* @throws IOExc ...

  2. SpringBoot打开resources目录下的文件操作

    SpringBoot打开resources目录下的文件操作 背景 我想在SpringBoot项目中放入一个静态文件.json文件.然后在SpringBoot项目内可以打开并读取此json文件. [外链 ...

  3. 获取resources目录下文件路径的九套功法

    文章目录 前述 功法一 功法二 功法三 功法四(重要) 功法五(重要) 功法六(重要) 功法七 功法八 功法九 前述 项目开发中,经常会有一些静态资源,被放置在resources目录下,随项目打包在一 ...

  4. 在maven项目结构下对于Resources目录下文件的存取

    在maven项目中,文件结构如下: proj---src----main ----java ----Main.java ----resources ----userFile.properties -- ...

  5. Android读取assets目录下文件数据内容

    Android读取assets目录下文件数据内容 Android的体系架构设计中,assets目录下的数据内容(图片.文件等等)将不会被Android系统压缩.二次处理等,assets目录下的文件 ...

  6. classpath和读取resources目录下的文件

    最近在springboot+maven的项目中去读取资源文件的时候,报了找不到文件的错误.由此展开了对maven项目编译前和编译后的目录结构的了解,以及对java的classpath的理解. 首先,由 ...

  7. java resources 目录_[Java] 在 jar 文件中读取 resources 目录下的文件

    注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...

  8. java读取resouces目录下文件

    resources中存放一些个资源文件,比如properties文件等,编译好会自动将这里边的文件复制到target/classes里去.获取资源文件的方法说明: XXX.class.getResou ...

  9. Android:读取assets目录下文件(二)

    在上篇博客里,介绍了如何读取assets目录下的txt文件.在这里,介绍如何读取xml文件. xml文件内容如下: <?xml version="1.0" encoding= ...

  10. resources目录下文件加载失败,class path resource [***] cannot be resolved to URL because it does not exist

    jar包中文件加载解决姿势: new InputStreamReader(Objects.requireNonNull(IotRSAPemUtil.class.getResourceAsStream( ...

最新文章

  1. 4.4.4 Factory方法
  2. paddleocr win10 编译
  3. 还是分了的好——看惠普、赛门铁克拆分
  4. 胶囊网络不同实现代码
  5. CSDN 总部落户长沙,共建中国开发者产业中心城市!
  6. Android:安卓线性布局(属性)
  7. ashly理器4.8软件汉化版_工程造价专业 常用广联达CAD等软件 推荐什么笔记本电脑?...
  8. java excel 2007兼容包_Microsoft Office 2007兼容包
  9. 人体的神经系统图 分布,人神经系统分布图高清
  10. 读取采购订单附件(GOS)-[BDS_GOS_CONNECTIONS_GET/SO_DOCUMENT_READ_API1]
  11. 四级英语口语模拟测试软件,英语四级口语模拟题:非常有用
  12. TriCore 与 RT-Thread(TC264 移植)
  13. 内网监控群晖918+(docker telegraf influxdb grafana)
  14. 程序人生:如何成为一名优秀的全栈工程师
  15. 高一末计算机考试试题,高一计算机第一学期期末试题
  16. mybatis-plus 注解 通过中间表进行一对多、多对多查询(三表)
  17. 1药网发布Q4财报:仍处于持续亏损状态,还要推动子公司上市
  18. 三翼鸟,从做家务开始打破家居生活的“标准范式”
  19. 内是不是半包围结构_半包围结构是什么意思 半包围结构字的书写规则
  20. 【课程汇总】Hello HarmonyOS系列课程,手把手带你零基础入门

热门文章

  1. 公众号下面显示一排服务器,新技能get 微信公众号文章花式排版大法
  2. java培训靠谱吗?java培训机构哪个好?
  3. Java--获取xml头encoding编码方式
  4. 一路向前大数据推荐算法团队
  5. 程序读取凡人修仙传热度数据
  6. 网口压线顺序_网线水晶头接法
  7. MySQL多实例管理(mysqld_multi)
  8. Python 库 Geopy 的用法,经纬度坐标转换、经纬度距离计算
  9. 中国纯碱市场产销现状与投资效益预测报告(2022-2027年)
  10. 我们的眼睛用得太狠了