使用SpringBoot获取resources文件路径
作者:hongyu#ding 发布时间:2022-10-12 15:29:56
获取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文件里面的图片就不显示了。
期间尝试了使用文件服务器上的图片,是可以正常显示的,但是由于文件服务器跟外网不通,所以生成的文件,放到别的地方,图片就不显示了。
最后还是采用最笨的方法,将容器内部的某个路径挂载到宿主机的同名路径上,在宿主机的文件夹下存放固定的模板文件和需要用到的图片,路径硬编码写死到程序里面,也是可以正常生成文件和回显的。
来源:https://blog.csdn.net/dinghongyu520/article/details/104702508


猜你喜欢
- 出处:https://www.cnblogs.com/SunSpring作为初学者配置maven一般网上搜索。然后你就看到各种配置文件片段,
- 一、简介Mutex的突出特点是可以跨应用程序域边界对资源进行独占访问,即可以用于同步不同进程中的线程,这种功能当然这是以牺牲更多的系统资源为
- 我们平时在日常项目中经常会遇到图片的上传和访问的情景,平时我们可能习惯于把图片传到resource或者项项目中的某个位置,这样会有一个缺点,
- 如下所示:TextView tv = (TextView) findViewById(R.id.text); tv.getPaint().s
- c# chart缩放,局部放大效果:左键划选放大区域,右键恢复 /// <sum
- 示例我们先来以这样一个场景引入: 在电脑城装机总有这样的经历。我们到了店里,先会有一个销售人员来询问你希望装的机器是怎么样的配置,
- 写在前面Activity是Android四大组件之一,用于直接跟用户进行交互,本篇文章将介绍Activity的启动流程。用户启动Activi
- android提供的工具链和开发工具比较完善,因此它的开发环境的搭建比较简单,相信许多朋友都已经搭建好环境,并编写了HelloA
- 原生Toast样式自定义Toast样式创建样式所谓自定义一个Toast就是建立一个布局文件,然后使用一个view容器承载,然后显示出来。To
- 背景:今天新生成一个springboot项目,然而启动日志,还有mybatis的详细日志无法打印出来,自写程序中打印的日志可以输出;网上找了
- 项目地址: GITHUB (本地下载)java mybatis 多表查询简介实现简单的实体类操作多表, 首先你的项目是
- 一、Stream流介绍在JDK8时,JAVA新增了lambda表达式,它与 java.io 包里的 InputStream和 OutputS
- 本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下:简单描述最高位是符号位,始终为0,不可用。41位的时间序列,
- 实现引导小圆点的方法其实很简单,可直接在布局上放置与引导页面等量的ImageView,然后在切换页面的时候更改图片资源就好了。这里顺便提一下
- 1.新建一个项目2.给项目添加引用:Microsoft Excel 12.0 Object Library (2007版本)using Ex
- 外观模式: 又称门面模式: 外观Facade为子系统的一组接口提供一个一致界面,使得这组子系统易于使用(通过引入一个新的外观角色降低原系统复
- 最近在写一个小项目,其中有一点用到了显示EditText中输入了多少个字符,像微博中显示剩余多少字符的功能。在EditText提供了一个方法
- 限时抢购倒计时实现效果图布局:<LinearLayout android:id="@+id/ll_
- 引言从前面我们可以大致了解了协程的玩法,如果一个协程中使用子协程,那么该协程会等待子协程执行结束后才真正退出,而达到这种效果的原因就是协程上
- 什么是sam 转换Single Abstract Method 实际上这是java8中提出的概念,你就把他理解为是 一个方法的接口 的就可以