Java 如何在不创建文件对象的情况下将BuffereImage附加到MimeBodyPart
我正在创建一个Java 如何在不创建文件对象的情况下将BuffereImage附加到MimeBodyPart,java,jakarta-mail,Java,Jakarta Mail,我正在创建一个BufferedImage并试图将其包含到MimeBodyPart 详情如下: buffereImage img=generateQR(otp); messageBodyPart=新的MimeBodyPart(); 文件测试=新文件(“phill.png”); ImageIO.write(img,“png”,测试); DataSource fds=新文件数据源(测试); setDataHandler(新的DataHandler(fds)); messageBodyPart.setF
BufferedImage
并试图将其包含到MimeBodyPart
详情如下:
buffereImage img=generateQR(otp);
messageBodyPart=新的MimeBodyPart();
文件测试=新文件(“phill.png”);
ImageIO.write(img,“png”,测试);
DataSource fds=新文件数据源(测试);
setDataHandler(新的DataHandler(fds));
messageBodyPart.setFileName(“./phill.png”);
messageBodyPart.setHeader(“内容ID”,即“”);
multipart.addBodyPart(messageBodyPart);
test.delete();
是否有任何方法可以附加缓冲区图像
,而不创建文件
请假定
- generateQR()已存在
- 有一个HTML
MimeBodyPart
byte[] imageBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData();
ByteArrayDataSource bds = new ByteArrayDataSource(imageBytes, "image/png");
messageBodyPart.setDataHandler(new DataHandler(bds));
messageBodyPart.setFileName("./phill.png");
messageBodyPart.setHeader("Content-ID", "<image>");
multipart.addBodyPart(messageBodyPart);
进行以下操作:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.flush();
byte[] imageBytes= baos.toByteArray();
baos.close();
(示例源自)您可以将图像数据传输到任何
输出流,例如a,然后使用写入(内存)的字节。@JimmyB如何将字节附加到MimeBodyPart
:/检查@PhillAlexakis,可能使用而不是FileDataSource
?@JimmyB您是对的,也谢谢您!我想img.getData().getBuffer()
返回DataBufferInt
,我得到了一个java.awt.image.DataBufferInt不能在sendmailsmtp.sendmail(sendmailsmtp.java:46)转换为java.awt.image.DataBufferByte,因为转换ImageIO.write()
正在创建一个本地png,不是吗?这里不是本地文件,它会写入您想要的输出流,在本例中,它是内存中的“流”。对,很抱歉,我没有看到您正在通过tearrayoutputstream写入,
,只有当图像的数据缓冲区已经包含PNG编码的数据时,第一个建议的解决方案才会起作用。这是不可能的,因为该图像以前可能从未是PNGImageIO.write()
是确保获得特定格式图像数据的唯一可靠方法。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.flush();
byte[] imageBytes= baos.toByteArray();
baos.close();