You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中Qute与Mailer嵌入图片失败问题求助

解决Quarkus邮件内嵌Jar中资源文件的问题

问题根源

你遇到的FileSystemException是因为Jar包内的资源无法通过File类直接访问——Jar是压缩归档文件,内部资源并非文件系统中的独立文件,直接用文件路径查找必然失败。之前尝试getResourceAsStream无效,大概率是路径错误或方法重载使用不当。

正确实现代码

由于图片存放在META-INF/resources/quarkus-logo.png(类路径根目录下的路径),请通过类加载器获取资源输入流,并调用Mailer支持输入流的addInlineAttachment重载方法。修正后的完整代码如下:

@Inject
Mailer mailer; 

@GET
@Path("/html")
public void sendingHTML() {
    String body = "<strong>Hello!</strong>" + "\n" +
            "<p>Here is an image for you: <img id=\"quarkus-logo\" src=\"cid:my-image@quarkus.io\"/></p>" +
            "<p>Regards</p>";

    // 从类路径根目录获取资源输入流
    try (InputStream imageStream = getClass().getClassLoader().getResourceAsStream("META-INF/resources/quarkus-logo.png")) {
        if (imageStream == null) {
            throw new IllegalStateException("资源文件不存在: META-INF/resources/quarkus-logo.png");
        }

        mailer.send(Mail.withHtml("example@gmail.com", "An email in HTML", body)
                .addInlineAttachment(
                        "quarkus-logo.png", // 附件文件名
                        imageStream,        // 资源输入流
                        "image/png",        // MIME类型
                        "<my-image@quarkus.io>" // CID标识,需与HTML中的cid匹配
                ));
    } catch (IOException e) {
        throw new RuntimeException("读取资源文件失败", e);
    }
}

核心注意点

  • 路径必须准确:类加载器的getResourceAsStream从类路径根开始查找,因此要写完整路径META-INF/resources/quarkus-logo.png,不能省略前缀。
  • 自动关闭流:使用try-with-resources语法确保输入流自动关闭,避免资源泄漏。
  • CID严格匹配:HTML中的cid:my-image@quarkus.io必须和addInlineAttachment的最后一个参数<my-image@quarkus.io>完全一致(包含尖括号)。

备选路径写法(不推荐)

如果你的类位于test.quarkus.resource包,也可以用类的相对路径导航到类路径根,但绝对路径更稳定:

InputStream imageStream = getClass().getResourceAsStream("/../../../../META-INF/resources/quarkus-logo.png");

内容的提问来源于stack exchange,提问作者Svart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:50:29