Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不创建文件对象的情况下将BuffereImage附加到MimeBodyPart_Java_Jakarta Mail - Fatal编程技术网

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编码的数据时,第一个建议的解决方案才会起作用。这是不可能的,因为该图像以前可能从未是PNG
ImageIO.write()
是确保获得特定格式图像数据的唯一可靠方法。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.flush();
byte[] imageBytes= baos.toByteArray();
baos.close();