1

I am using a virtual filesystem and I'd like to attach a file from it to an email. However, the MimeBodyPart object only takes Files, which don't work on a default filesystem like jimfs. See my code below, where I get an UnsupportedOperation exception when I try to convert to file.

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

2 回答 2

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);
于 2017-06-06T18:41:59.317 回答
1

不管这个MimeBodyPartAPI 是什么,都应该有一个使用 a 的选项,Path这样你就可以直接使用 Jimfs 文件,但是由于java.nio.fileAPI 需要 Java 7 并且不能在 Android 上运行,不幸的是许多库还不支持Path

toFile()永远不能用于 Jimfs 文件,或任何不在默认文件系统上的文件,因为File该类只能表示默认文件系统上的文件。所以,是的,您需要将 Jimfs 文件复制到真实文件系统才能使用此attachFile方法。

如果MimeBodyPartAPI 有使用 aURLURI附件的选项,您可能可以使用该 plus file.toUri()[.toURL()]。或者,如果它可以使用,例如,InputStream您显然可以从文件中获取其中一个并使用它。

于 2017-06-06T18:18:12.460 回答