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
相关产品推荐
相关产品推荐

