使用SpringBoot获取resources文件路径

 更新时间:2022年06月17日 10:21:30   作者:hongyu#ding  
这篇文章主要介绍了使用SpringBoot获取resources文件路径,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

获取resources文件路径

背景

在SpringBoot项目中,需要获取resources文件的路径,网上找了好多文章都不行,后面还是结合官方文档实现了,这里记录下,我使用的版本是SpringBoot2.x版本

解决方案

1、获取resources文件夹路径

File directory = new File("xxx/xxx/src/main/resources");
String reportPath = directory.getCanonicalPath();

xxx为你的项目内包的名称,File只会找到项目最外层地址;

这里需要注意,不能在xxx前面加/,否则只会找到顶层地址 

获取resource下文件夹路径的坑

现在有个需求是需要利用模板文件生成HTML 或者 PDF 文件,然后由于HTML 模板文件里面包含图片和字体,然后我就在resource 文件夹下新建了一个文件夹,然后又分类,也就是 resource 下面有个 upload文件夹,有个 templateFile 文件夹,然后才是模板文件。也就是说模板文件在resource下面两级目录里面,那么问题来了。用了各种办法,就是获取不到这个文件。。。。。。。。

前提是maven项目的pom文件里面配置了

maven打包包含这些模板文件:

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.png</include>
                    <include>**/*.html</include>
                    <include>**/*.ttf</include>
                    <include>**/*.TTF</include>
                    <include>**/*.ttc</include>
                </includes>
                <!--是否替换资源中的属性-->
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

然后install后,可以在当前模块或者项目的 target 文件夹下可以看到我们的模板文件。

这是后来我修改后的正常打包情况

其中代码里面,用了好评率最高的这个 ClassPathResource

import org.springframework.core.io;
Resource resource = new ClassPathResource("upload/templateFile");
log.info("contextPath:{}", resource.getURL());

这时候,按照理想情况,应该就是可以打印出来 templateFile 这个文件夹所在的绝对路径了。如果这个文件夹存在resource下面,是可以拿到这个文件夹的绝对路径的。

事实确是空的。。。。。就很神奇,刚开始以为。是不是因为跟别人的项目不一样,才导致的这个问题呢。

后面踩坑了半天,发现,是不是路径太深了,把往前提一层呢,就试下把 templateFile 直接放到 resources 下面,再次尝试,发现上面日志不再是空的了,可以正常取到模板文件所在的绝对路径了。这点windows和Linux都是可以的。

然后看似问题解决了,但是由于我这边部署使用docker镜像部署的,获取模板文件和生成文件也是正常的,但是由于生成的HTML文件用到了各种logo图片文件,然后生成的文件所在位置也挂载到宿主机上了,在容器内部查看生成的文件是正常的,但是到了宿主机上,生成的HTML文件里面的图片就不显示了。

期间尝试了使用文件服务器上的图片,是可以正常显示的,但是由于文件服务器跟外网不通,所以生成的文件,放到别的地方,图片就不显示了。

最后还是采用最笨的方法,将容器内部的某个路径挂载到宿主机的同名路径上,在宿主机的文件夹下存放固定的模板文件和需要用到的图片,路径硬编码写死到程序里面,也是可以正常生成文件和回显的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java验证码图片生成代码

    Java验证码图片生成代码

    这篇文章主要为大家详细介绍了Java验证码图片生成代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Springboot实现XSS漏洞过滤的示例代码

    Springboot实现XSS漏洞过滤的示例代码

    这篇文章主要介绍了Springboot实现XSS漏洞过滤的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • SpringBoot3中数据库集成实践详解

    SpringBoot3中数据库集成实践详解

    项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,所以下面小编就来和大家讲讲SpringBoot3如何实现数据库集成,需要的可以参考下
    2023-08-08
  • Spring大白话之三级缓存如何解决循环依赖问题

    Spring大白话之三级缓存如何解决循环依赖问题

    Spring通过三级缓存(singletonObjects、earlySingletonObjects、singletonFactories)解决单例循环依赖,三级缓存使用Lambda表达式提前暴露bean的早期引用,确保在递归调用时能够正确获取对象实例,避免死循环
    2025-02-02
  • Java8 实现stream将对象集合list中抽取属性集合转化为map或list

    Java8 实现stream将对象集合list中抽取属性集合转化为map或list

    这篇文章主要介绍了Java8 实现stream将对象集合list中抽取属性集合转化为map或list的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java并发之ArrayBlockingQueue详细介绍

    java并发之ArrayBlockingQueue详细介绍

    这篇文章主要介绍了java并发之ArrayBlockingQueue详细介绍的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java中使用Closeable接口自动关闭资源详解

    Java中使用Closeable接口自动关闭资源详解

    这篇文章主要介绍了Java中使用Closeable接口自动关闭资源详解,Closeable接口继承于AutoCloseable,主要的作用就是自动的关闭资源,其中close()方法是关闭流并且释放与其相关的任何方法,如果流已被关闭,那么调用此方法没有效果,需要的朋友可以参考下
    2023-12-12
  • Spring Bean 中的生命周期和获取方式详解

    Spring Bean 中的生命周期和获取方式详解

    Bean的加载和获取过程涉及配置文件解析、资源加载、XML解析和BeanDefinition注册等步骤,本文给大家介绍Spring Bean 的生命周期和获取方式,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Spring 中的 Service 有多个实现类如何注入(多种方式)

    Spring 中的 Service 有多个实现类如何注入(多种方式)

    这篇文章主要介绍了Spring 中的 Service 有多个实现类如何注入,本文通过多种方式结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 排序算法图解之Java希尔排序

    排序算法图解之Java希尔排序

    希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序,即将简单的插入排序进行改进后的一个更加高效的版本,也称缩小增量排序。本文通过图片和示例讲解了希尔排序的实现,需要的可以了解一下
    2022-11-11

最新评论