如何从Spring Boot资源文件夹中嵌入图像和附加文件

3
无法从Spring Boot资源文件夹嵌入图像和附加文件。
我使用Spring Boot(Jar文件而不是War文件)创建了一个Restful Web服务。其中一些服务将发送电子邮件,其中一些将发送带有附件的电子邮件(将动态创建)。Web部分(Angular)位于部署在不同服务器中的Apache服务器中。
我正在使用Freemarker模板来组成电子邮件,并使用Amazon SES发送电子邮件。
来自Freemarker模板。
<IMG src="cid:gridEmailHeaderImage">

添加图片的代码

MimeBodyPart inlineImage = new MimeBodyPart();
DataSource fds = new FileDataSource(imagePath.getAbsolutePath());
inlineImage.setDataHandler(new DataHandler(fds));
inlineImage.setHeader("Content-ID", "<" + contentId + ">");
inlineImage.setFileName(fds.getName());
content.addBodyPart(inlineImage);

如果我提供绝对路径,我就可以嵌入和附加文件。但是如果提供相对路径,则无法工作。

我的文件夹结构

C:\workspace\service-1.0\src\main\resources\images\header.png
C:\workspace\service-1.0\src\main\resources\attachements\test-attachment-1.txt

I tried the following with no sucess

Approach 1

ServletContext context;
String path = context.getRealPath("/resources/images")+"/header.png";

它正在以下文件夹中查找图像,但该文件夹中没有可用的图像。

C:\Users\username\AppData\Local\Temp\tomcat-docbase..\resources\images/header.png

方法2

basePath = this.getClass().getClassLoader().getResource("/images/").getPath();

C:\workspace\service-1.0\src\main\resources\images\header.png

/C:/workspace/service-1.0/build/libs/service-1.0.jar!/BOOT-INF/classes!/images/ (只能从eclipse工作,但不能从命令提示符java -jar build\lib\myapp.jar中运行)

方法三

ClassPathResource file = new ClassPathResource("header.png");
String mypath = file.getFile().getAbsolutePath();

这个方法也行不通。

如果我把图片放在资源文件夹下的图像文件夹中,我可以通过以下URL查看该图片。

http://localhost:7075/myservice/v1/images/header.png

从资源文件夹加载图像是否可行?Spring Boot JAR包会在运行时被解压吗?从Spring Boot JAR文件加载图像的正确方法是什么。

1个回答

6

由于您的资源是 jar 容器的一部分,因此您不能使用文件路径,而应该使用类加载器提供的 URL。根据您是从 IDE 运行还是部署的 jar 包运行,这将是一个 file://...jar:... URL。资源文件夹不是 spring boot 结构的一部分,因此您不能使用它。使用 URLDataSource,您可以这样做:

URLDataSource source = new URLDataSource(this.getClass().getResource("/images/header.png"));

太好了,听到这个消息很高兴 :-) 如果您能将其标记为正确答案,那就非常友善了。 - Ralf Stuckert
我刚刚将答案标记为正确答案。再次感谢你。 - Thiagarajan Ramanathan
嗨@RalfStuckert,我正在尝试将图像保存在Angular资产文件夹中,但我不确定它如何处理此过程,您能否请检查一下我的问题:https://dev59.com/uHkPtIcB2Jgan1zniTfm - Sonn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接