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

java将文件从虚拟文件系统附加到电子邮件,java,jakarta-mail,nio,jimfs,Java,Jakarta Mail,Nio,Jimfs,我正在使用一个虚拟文件系统,我想将其中的一个文件附加到电子邮件中。但是,MimeBodyPart对象只接受文件,而这些文件在像jimfs这样的默认文件系统上不起作用。请参阅下面的代码,当我尝试转换为文件时,会出现不支持操作异常 public Email attach(Path file){ MimeBodyPart attachment = new MimeBodyPart() attachment.attachFile(file.toFile()) attachment

我正在使用一个虚拟文件系统,我想将其中的一个文件附加到电子邮件中。但是,MimeBodyPart对象只接受文件,而这些文件在像jimfs这样的默认文件系统上不起作用。请参阅下面的代码,当我尝试转换为文件时,会出现不支持操作异常

public Email attach(Path file){
    MimeBodyPart attachment = new MimeBodyPart()
    attachment.attachFile(file.toFile())
    attachments.add(attachment)
    return this
}
不管这个MimeBodyPart API是什么,它都应该有一个使用路径的选项,这样您就可以直接使用Jimfs文件,但是由于java.nio.file API需要java 7,并且不能在Android上工作,但不幸的是,许多库还不支持路径

toFile永远不能用于Jimfs文件或不在默认文件系统上的任何文件,因为file类只能表示默认文件系统上的文件。因此,您需要将Jimfs文件复制到实际的文件系统中,才能使用此attachFile方法

如果MimeBodyPart API可以选择为附件使用URL或URI,那么您可能可以使用plus文件.toUri[.tour]。或者,如果它可以使用,比如说,一个InputStream,你显然可以从文件中获取其中一个,然后使用它。

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

toFile永远不能用于Jimfs文件或不在默认文件系统上的任何文件,因为file类只能表示默认文件系统上的文件。因此,您需要将Jimfs文件复制到实际的文件系统中,才能使用此attachFile方法

如果MimeBodyPart API可以选择为附件使用URL或URI,那么您可能可以使用plus文件.toUri[.tour]。或者,如果它可以使用,比如说,一个输入流,那么显然可以从文件中获取一个输入流,然后使用它。

因为jimfs文件不是真正的文件,所以不能使用文件API

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

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

MimeBodyPart mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(new PathDataSource(path)));
mbp.setFileName(path.getFileName().toString());
mbp.setDisposition(Part.ATTACHMENT);
因为jimfs文件不是真正的文件,所以不能使用文件API

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

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

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

您使用的是什么版本的API?将文件附加到不支持虚拟文件系统的MimeBodyPart或file.toFile时是否发生不支持操作?file.toFile调用正在引发不支持的异常,因为jimfsPath未实现该方法。我正在使用Java8。据我所知,MimeBodyPart只知道如何与文件交互,而不知道如何与路径对象交互。因此,如果我理解正确,您需要使用jimfs API,将文件写入文件系统,然后附加到MimeBodyPart类。高级方法是扩展文件并覆盖允许来自jimfs的动态内容流的方法。不过,我会首先坚持简单的方法。您使用的是什么版本的API?将文件附加到不支持虚拟文件系统的MimeBodyPart或file.toFile时是否发生不支持操作?file.toFile调用正在引发不支持的异常,因为jimfsPath未实现该方法。我正在使用Java8。据我所知,MimeBodyPart只知道如何与文件交互,而不知道如何与路径对象交互。因此,如果我理解正确,您需要使用jimfs API,将文件写入文件系统,然后附加到MimeBodyPart类。高级方法是扩展文件并覆盖允许来自jimfs的动态内容流的方法。不过,我会首先坚持简单的方法。看起来我可能会在市场上寻找一个新的邮件api://@Steve Use。然后使用@bill shannon中的示例代码,但使用此mbp.setDataHandlernew DataHandlernew URLDataSourcepath.toUri.Tour作为源代码。如果jimfs提供可用于URLConnection的真实URL,这也会起作用。我这里有一个相关问题。将我的路径转换为URI似乎适用于电子邮件,但不适用于zipfiles:/@BillShannon:Jimfs确实提供了可用于URLConnection的URL。虽然我认为你的解决方案很好。看起来我可能会在市场上寻找一个新的邮件api://@Steve Use。然后使用@bill shannon中的示例代码,但使用此mbp.setDataHandlernew DataHandlernew URLDataSourcepath.toUri.Tour作为源代码。如果jimfs提供可用于URLConnection的真实URL,这也会起作用。我这里有一个相关问题。将我的路径转换为URI似乎适用于电子邮件,但不适用于zipfiles:/@BillShannon:Jimfs确实提供了可用于URLConnection的URL。虽然我认为你的解决方案
n是一个很好的对象。PathdataSource对象来自哪里?我很难找到我看到的文档FileDataSource你是基于FileDataSource编写的。这是可行的,但请参阅jmehrens对Colin答案的评论,以获得更干净的解决方案。谢谢你,比尔!PathdataSource对象来自哪里?我很难找到我看到的文档FileDataSource你是基于FileDataSource编写的。这是可行的,但请参阅jmehrens对Colin答案的评论,以获得更干净的解决方案。谢谢你,比尔!