2017-06-06 83 views
0

我正在使用一个虚拟文件系统,并且我想从它附加一个文件到电子邮件。但是,MimeBodyPart对象只接收文件,这些文件不适用于像jimfs这样的默认文件系统。看到我的代码如下,当我尝试转换为文件时,出现UnsupportedOperation异常。java从虚拟文件系统附加文件到电子邮件

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

您使用的是什么版本的API?将不支持的操作发生在将文件附加到不支持虚拟文件系统的MimeBodyPart或File.toFile()上? –

+0

file.toFile()调用抛出不支持的异常,因为jimfsPath没有实现该方法。我正在使用java 8.据我所知,MimeBodyPart只知道如何与文件交互,而不是Path对象。 – Steve

+0

好所以如果我理解你正确,你需要使用jimfs API,将文件写入文件系统,然后附加到MimeBodyPart类。高级方法是“扩展”文件并覆盖允许从jimfs动态传输内容的方法。不过,我会先坚持简单的方法。 –

回答

3

由于jimfs文件不是真的是文件,所以不能使用文件API。

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

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

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

PathdataSource对象从哪里来?我无法找到文档(我看到FileDataSource) – Steve

+0

您根据FileDataSource编写它。 –

+0

这有效,但请参阅jmehrens对科林回答更清晰的解决方案的评论。谢谢比尔! – Steve

1

不管这MimeBodyPart API是真的应该有使用Path,这样你可以只使用Jimfs直接文件的选项,但由于java.nio.file API需要的Java 7,不要在Android上工作很遗憾很多图书馆还不支持Path

toFile()不能为Jimfs文件工作,或任何文件不是默认的文件系统上,因为File类只能代表默认的文件系统上的文件。所以是的,你需要将Jimfs文件复制到真正的文件系统以使用这种方法。

如果MimeBodyPart API已经为使用URLURI为附件选项,你可能能够使用加file.toUri()[.toURL()]。或者,如果它可以使用,例如InputStream,您显然可以从文件中获得其中一个,然后使用它。

+0

看起来我可能会在市场上购买新的邮件API:/ – Steve

+1

@Steve使用[javax.activation.URLDataSource](https://docs.oracle.com/javase/7/docs/api/javax/activation/ URLDataSource.html)。然后使用来自@ bill-shannon的示例代码,但使用这个'mbp.setDataHandler(new DataHandler(new URLDataSource(path.toUri()。toURL())))'作为源代码。 – jmehrens

+0

如果jimfs提供可用于URLConnection的真实URL,那也可以。 –

相关问题