我有一段代码可以读取我的收件箱电子邮件。代码识别2种附件:
1)附加的文件,下载并保存到数据库中。这很好用。
2)内联附件(我在测试中使用图像作为附件)。代码检测到这种附件,但是当我将它们保存到磁盘时,文件似乎已损坏。我检查了生成的文件属性,发现它没有基本信息(像素,高度,宽度)。我认为下载到磁盘时文件保存不正确(我尝试过PNG和JPG)。我认为文件需要保存一种mimetype属性,所以我可以正确打开它。有什么提示吗?在此先感谢。!
以下是我的代码片段:
public void procesMultiPart(Multipart content) throws SQLException {
try {
for (int i = 0; i < content.getCount(); i++) {
BodyPart bodyPart = content.getBodyPart(i);
Object o;
String downloadDirectory = "D:/Attachment/";
o = bodyPart.getContent();
if (o instanceof String) {
System.out.println("procesMultiPart es plainText");
} else if (null != bodyPart.getDisposition() && bodyPart.getDisposition().equalsIgnoreCase(Part.ATTACHMENT)) {
System.out.println("IS ATTACHMENT...");
// i save the attachment to database and is OK..
} else if (bodyPart.getDisposition() == null){
System.out.println("IS AN INLINE ATTACHMENT...");
String fileNameinline = "inline" + i + ".png";
InputStream inStream = bodyPart.getInputStream();
FileOutputStream outStream = new FileOutputStream(new File(downloadDirectory + fileNameinline), true);
byte[] tempBuffer = new byte[4096];// 4 KB
int numRead;
while ((numRead = inStream.read(tempBuffer)) != -1) {
outStream.write(tempBuffer);
}
inStream.close();
outStream.close();
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
文件已损坏,因为您将其正确写入光盘:
outStream.write(tempBuffer);
你应该只写你读的字节数:
outStream.write(tempBuffer, 0, numRead);
答案 1 :(得分:0)
感谢大家的帮助和提示。我解决了这个问题。我是这样做的:我注意到当阅读电子邮件正文(假设只有粘贴的图像)时,只有图像,还有一种HTML,所以换句话说,身体部分有多个部分(在我的情况下是两个部分),所以我必须处理每个部分,直到找到图像,所以我可以保存它。 希望这有助于其他人。 问候。