2017-06-06 3 views
0

J'utilise un système de fichiers virtuel et j'aimerais y joindre un fichier à un courriel. Cependant, l'objet MimeBodyPart ne prend que les fichiers, qui ne fonctionnent pas sur un système de fichiers par défaut comme jimfs. Voir mon code ci-dessous, où j'obtiens une exception UnsupportedOperation lorsque j'essaie de convertir en fichier.java attacher le fichier du système de fichiers virtuel au courrier électronique

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

Quelle version de l'API utilisez-vous? L'opération unsupportedOperation est-elle survenue en attachant le fichier à MimeBodyPart ou à File.toFile() qui ne prend pas en charge le système de fichiers virtuel? –

+0

L'appel file.toFile() lance l'exception non prise en charge, car jimfsPath n'implémente pas cette méthode. J'utilise java 8. Autant que je sache, MimeBodyPart sait seulement comment interagir avec les fichiers, pas avec les objets Path. – Steve

+0

Ok Donc, si je vous ai bien compris, vous devez utiliser l'API jimfs, écrire le fichier dans le système de fichiers, puis le rattacher à la classe MimeBodyPart. La méthode avancée consiste à "étendre" le fichier et à surcharger les méthodes qui permettraient un flux dynamique du contenu à partir de jimfs. Cependant, je m'en tiens à l'approche simple en premier. –

Répondre

3

Depuis fichiers jimfs ne sont pas vraiment fichiers, vous ne pouvez pas utiliser les API de fichiers.

Une solution de contournement simple consiste à utiliser ByteArrayDataSource, qui va copier les données.

Une meilleure approche serait d'écrire votre propre PathDataSource qui est similaire à FileDataSource mais utilise Files.newInputStream au lieu de FileInputStream. Ensuite, joignez le fichier en utilisant:

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

D'où vient cet objet PathdataSource? J'ai du mal à trouver les docs (je vois FileDataSource) – Steve

+0

Vous l'écrivez, basé sur FileDataSource. –

+0

Cela fonctionne, mais voir le commentaire de jmehrens sur la réponse de Colin pour une solution plus propre. Merci Bill! – Steve

1

Quelle que soit cette API MimeBodyPart est vraiment devrait avoir une possibilité d'utiliser un Path de sorte que vous pouvez simplement utiliser le fichier Jimfs directement, mais depuis les java.nio.file API requièrent Java 7 et ne fonctionnent pas sur Android Pourtant, de nombreuses bibliothèques ne supportent malheureusement pas encore Path.

toFile() ne peut jamais travailler pour un fichier Jimfs, ou pour un fichier qui ne sont pas sur le système de fichiers par défaut, parce que la classe File ne peut représenter des fichiers sur le système de fichiers par défaut. Alors oui, vous auriez besoin de copier le fichier Jimfs sur le vrai système de fichiers pour utiliser cette méthode attachFile.

Si l'API MimeBodyPart avait une option pour utiliser un URL ou URI pour la pièce jointe, vous seriez probablement en mesure d'utiliser cela plus file.toUri()[.toURL()]. Ou si vous pouviez utiliser, par exemple, un InputStream vous pourriez évidemment en obtenir un du fichier et l'utiliser à la place.

+0

On dirait que je pourrais être sur le marché pour une nouvelle adresse mail:/ – Steve

+1

@Steve Utilisez [javax.activation.URLDataSource] (https://docs.oracle.com/javase/7/docs/api/javax/activation/ URLDataSource.html). Ensuite, utilisez l'exemple de code de @ bill-shannon mais utilisez ce 'mbp.setDataHandler (new DataHandler (nouvelle URLDataSource (path.toUri(). ToURL())))' en tant que source. – jmehrens

+0

Si jimfs fournit des URL réelles utilisables avec URLConnection, cela fonctionnera également. –