类路径资源[static / pixel.png]无法打开,因为它不存在Heroku

问题描述

我正在使用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());
    }

The static folder explorer

当我使用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" />