2017-06-06 33 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,那也可以。 –

相關問題