java附加文件从虚拟文件系统到电子邮件

时间:2017-06-06 14:22:39

标签: java javamail nio jimfs

我正在使用虚拟文件系统,我想将其中的文件附加到电子邮件中。但是,MimeBodyPart对象只接受文件,这些文件不能像jimfs这样的默认文件系统。请参阅下面的代码,当我尝试转换为文件时,我得到UnsupportedOperation异常。

public Email attach(Path file){
    MimeBodyPart attachment = new MimeBodyPart()
    attachment.attachFile(file.toFile())
    attachments.add(attachment)
    return this
}

2 个答案:

答案 0 :(得分:3)

由于jimfs文件不是真正的文件,因此您无法使用文件API。

一个简单的解决方法是使用ByteArrayDataSource,它将复制数据。

更好的方法是编写自己的PathDataSource,类似于FileDataSource,但使用Files.newInputStream而不是FileInputStream。然后使用以下方法附加文件:

MimeBodyPart mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(new PathDataSource(path)));
mbp.setFileName(path.getFileName().toString());
mbp.setDisposition(Part.ATTACHMENT);

答案 1 :(得分:1)

无论这个MimeBodyPart API真的应该都可以选择使用Path,以便您可以直接使用Jimfs文件,但是因为{{1} API需要Java 7并且不能在Android上运行,但很多库不幸还不支持java.nio.file

Path永远不能用于Jimfs文件,也不能用于默认文件系统上的任何文件,因为toFile()类只能代表默认文件系统上的文件。所以,是的,你需要将Jimfs文件复制到真实的文件系统才能使用这个File方法。

如果attachFile API有选项可以使用MimeBodyPartURL作为附件,那么您可能可以使用URIfile.toUri()[.toURL()]。或者,如果它可以使用InputStream,您显然可以从文件中获取其中一个并使用它。

相关问题