问题描述
我正在使用Jhipster开发Spring Boot应用程序,而我正在尝试向电子邮件中添加像素。 像素图像保存在资源/静态文件夹中。 我的像素链接:
@GetMapping("/email-status/OPENED/{customer}")
@Timed
public void mailOpened(@PathVariable String customer,HttpServletResponse response) throws IOException {
//code...
InputStream in = new ClassPathResource("/static/pixel.png").getInputStream();
response.setContentType(MediaType.IMAGE_PNG_VALUE);
IoUtils.copy(in,response.getoutputStream());
}
当我使用localhost:8080 / api / email-status / OPENED /从浏览器调用api时... 显示像素图像。
但是当我从我的域 https://app.mydomain.com/api/email-status/OPENED/123
打来电话时(我正在使用 Heroku 进行托管) 我收到此错误
java.io.FileNotFoundException:类路径资源[static / pixel.png]无法打开,因为它不存在
有人知道为什么会这样吗?
解决方法
在我看来,本地主机使用生成的类,而域使用jar。在后一种情况下,图像在罐子里,这就是为什么找不到它的原因。
文档中ClassPathResource的声明:
如果类路径资源驻留,则支持将解析为java.io.File 在文件系统中,但不用于JAR中的资源
也许您应该考虑使用
YourClassName.class.getResourceAsStream("/static/pixel.png")
关于使用资源的非常有用的链接是"How to Use Icons"
,如果您将应用程序部署在网络服务器上以便从您的域访问它,则该应用程序只能访问也存储在同一服务器上的图像。
在这种情况下,您必须将图像复制到服务器上相应的文件夹中。
,所以我没有找到任何答案,图像存在于文件中,但无法使用任何本地路径资源解决方案..
我已决定托管图片并使用链接而不是静态图片,这是我的有效解决方案
InputStream in = new URL("https://some-host/12345/pixel.png").openStream();
response.setContentType(MediaType.IMAGE_PNG_VALUE);
IOUtils.copy(in,response.getOutputStream());
对我来说还必须做的一件事是,img标签应该包含所有这些参数
<img src="image_url(the pixel image)" alt="Logo" title="Logo" style="display:block" width="1" height="1" />