java 将文件从虚拟文件系统附加到电子邮件
java attach file from virtual filesystem to email
我正在使用虚拟文件系统,我想将其中的文件附加到电子邮件中。然而,MimeBodyPart 对象只接受文件,它不能在像 jimfs 这样的默认文件系统上工作。请参阅下面的代码,当我尝试转换为文件时出现 UnsupportedOperation 异常。
public Email attach(Path file){
MimeBodyPart attachment = new MimeBodyPart()
attachment.attachFile(file.toFile())
attachments.add(attachment)
return this
}
无论这个 MimeBodyPart
API 是什么 都应该 可以选择使用 Path
这样你就可以使用 Jimfs直接提交文件,但是由于 java.nio.file
API 需要 Java 7 并且不能在 Android 上工作,但遗憾的是许多库还不支持 Path
。
toFile()
永远无法用于 Jimfs 文件,或 任何不在默认文件系统上的 文件,因为 File
class只能表示默认文件系统上的文件。所以是的,您需要将 Jimfs 文件复制到真实文件系统才能使用此 attachFile
方法。
如果 MimeBodyPart
API 可以选择使用 URL
或 URI
作为附件,您可能可以使用它加上 file.toUri()[.toURL()]
.或者,如果它可以使用 InputStream
,您显然可以从文件中获取其中一个并改为使用它。
由于 jimfs 文件不是真正的文件,您不能使用文件 API。
一个简单的解决方法是使用 ByteArrayDataSource,这将复制数据。
更好的方法是编写您自己的类似于 FileDataSource but uses Files.newInputStream 的 PathDataSource,而不是 FileInputStream。然后使用以下方式附加文件:
MimeBodyPart mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(new PathDataSource(path)));
mbp.setFileName(path.getFileName().toString());
mbp.setDisposition(Part.ATTACHMENT);
我正在使用虚拟文件系统,我想将其中的文件附加到电子邮件中。然而,MimeBodyPart 对象只接受文件,它不能在像 jimfs 这样的默认文件系统上工作。请参阅下面的代码,当我尝试转换为文件时出现 UnsupportedOperation 异常。
public Email attach(Path file){
MimeBodyPart attachment = new MimeBodyPart()
attachment.attachFile(file.toFile())
attachments.add(attachment)
return this
}
无论这个 MimeBodyPart
API 是什么 都应该 可以选择使用 Path
这样你就可以使用 Jimfs直接提交文件,但是由于 java.nio.file
API 需要 Java 7 并且不能在 Android 上工作,但遗憾的是许多库还不支持 Path
。
toFile()
永远无法用于 Jimfs 文件,或 任何不在默认文件系统上的 文件,因为 File
class只能表示默认文件系统上的文件。所以是的,您需要将 Jimfs 文件复制到真实文件系统才能使用此 attachFile
方法。
如果 MimeBodyPart
API 可以选择使用 URL
或 URI
作为附件,您可能可以使用它加上 file.toUri()[.toURL()]
.或者,如果它可以使用 InputStream
,您显然可以从文件中获取其中一个并改为使用它。
由于 jimfs 文件不是真正的文件,您不能使用文件 API。
一个简单的解决方法是使用 ByteArrayDataSource,这将复制数据。
更好的方法是编写您自己的类似于 FileDataSource but uses Files.newInputStream 的 PathDataSource,而不是 FileInputStream。然后使用以下方式附加文件:
MimeBodyPart mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(new PathDataSource(path)));
mbp.setFileName(path.getFileName().toString());
mbp.setDisposition(Part.ATTACHMENT);