我保存到磁盘的内联附件已损坏

时间:2015-07-19 19:30:36

标签: java javamail

我有一段代码可以读取我的收件箱电子邮件。代码识别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();
    }

}

2 个答案:

答案 0 :(得分:1)

文件已损坏,因为您将其正确写入光盘:

outStream.write(tempBuffer);

你应该只写你读的字节数:

outStream.write(tempBuffer, 0, numRead);

答案 1 :(得分:0)

感谢大家的帮助和提示。我解决了这个问题。我是这样做的:我注意到当阅读电子邮件正文(假设只有粘贴的图像)时,只有图像,还有一种HTML,所以换句话说,身体部分有多个部分(在我的情况下是两个部分),所以我必须处理每个部分,直到找到图像,所以我可以保存它。 希望这有助于其他人。 问候。