Voila j’ai un petit problème qui me prend la tête depuis hier. Je vous explique : j’aurais besoin de pouvoir convertir un byte[] que je récupère en DataSource.
J’en ai besoin car je voudrais envoyer des mails avec pièces jointe, et j’ai un objet qui me récupère la pièce jointe enregistré dans une base de donnée et me le rend sous forme de byte[]. Or pour pouvoir envoyer le message et sa pièce jointe grace à un Multipart j’ai besoin d’un DataSource, d’où problème aparemment.
Quelqu’un saurait-il si la conversion est possible et facilement réalisable ?
Au secours Obiwan Kenobi, vous êtes mon seul espoir
C’est quoi ta classe DataSource ? elle fait partie de quel package/bibliothèque. Tu peux filler un lien vers la Javadoc ?
[Edit]
J’ai trouvé comme un grand, mais je ne vois absolument pas le rapport entre un DataSource qui permet de gérer des connection sql d’après ce que j’ai lu brièvement, et un fichier sous forme de tableau de byte.
Et bien je veux m’en servir de la manière suivante :
// Définit le message
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
message.setSubject(« Pièce jointe »);
// Première partie du message
BodyPart messageBodyPart = new MimeBodyPart();
// Contenu du message
messageBodyPart.setText(« le voici »);
//Ajout de la première partie du message dans un objet Multipart
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// Partie de la pièce jointe
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(« image.gif »);
messageBodyPart.setDataHandler(new DataHandler(source));
//public DataHandler(java.net.URL url) donc possibilité d’envoyer à partir d’une url
messageBodyPart.setFileName(« image.gif »);
//Ajout de la partie pièce jointe
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
// Envoi du message
Transport.send(message);
Donc voila un exemple avec un fichier en direct.Or ce que me rend ma base oracle via un autre objet, est donc un fameux byte[] alors qu’il faut un DataSource si j’ai bien compris le code
Gagné, c’est bien ce package à priori d’après ce que j’ai vu (je précise que j’ai trouvé ce code sur le net, j’ai aucune idée de la manière dont ca marche l’envoie de mail huhu ( http://www.supinfo-projects.com/fr/2004/javamail/3/)
A priori, si tu veux vraiment utilisé ce code pour envoyé des mails (peut-être qu’il y a plus simple), soit tu trouves une classe toute faite dérivé de DataSource qui prend en paramètre du constructeur un tableau de byte ou soit tu créer toi-même cette classe ByteDataDource qui implémente DataSource et qui convertie ton tableau de byte en Flux. Regardes la javadoc de DataSource, tu veras qu’il n’y a pas beaucoup de méthode à implémenter.
Ce n’est pas compliquer du tout, malheureusement, je n’ai pas le temps pour le moment de te faire ça.
Ok merci, je vais essayer de voir ce que je peux faire.
Enfin si une bonne âme à le temp de me montrer comment faire (mais bon je vais essayer de faire ca ^^)
Bon en fait je pense avoir trouvé mon bonheur : j’ai trouvé ca
Cette Classe ByteArrayDataSource, implemente javax.activation.DataSource et possède un constructeur prenant un byte[]. A priori c’est ce que je cherche. Je vais voir ce que ca donne
[quote=« Cobra, post:7, topic: 27696 »]Ok merci, je vais essayer de voir ce que je peux faire.
Enfin si une bonne âme à le temp de me montrer comment faire (mais bon je vais essayer de faire ca ^^)[/quote]
Fait déjà le squelette de ta classe et une fois que tu as quelques choses d’à peu prêt fini, poste là et je te dirai si c’est bon ou pas.
Arf j’ai encore un problème avec ce satané truc !
Est-ce que t’aurais une idée ?
J’ai donc fait ma classe qui prend un byte[] et implémente l’interface DataSource.
Seulement je comprend pas, ca marche pas j’ai une erreur de compilation:
En faisant :
DataSource source = new ByteArrayDataSource (attFile,attContentType);
messageBodyPart.setDataHandler(new DataHandler(source));
j’ai :
/utils/send_005fcustomized_005fmail_jsp.java:180: incompatible types
found : com.edeal.frontline.custom.ByteArrayDataSource
required: javax.activation.DataSource
DataSource source = new ByteArrayDataSource (attFile,attContentType); (l’erreur est au niveau du new)
En faisant :
ByteArrayDataSource source = new ByteArrayDataSource (attFile,attContentType);
messageBodyPart.setDataHandler(new DataHandler(source));
j’ai :
/utils/send_005fcustomized_005fmail_jsp.java:182: cannot resolve symbol
symbol : constructor DataHandler (com.edeal.frontline.custom.ByteArrayDataSource)
location: class javax.activation.DataHandler
messageBodyPart.setDataHandler(new DataHandler(source)); (l’erreur est au niveau du new)
Oki merci :P. Bon j’ai zieuté un peu sur le net, et y’a des mecs qui ont le même code que moi, du coup j’aimerais bien savoir ce qui lui prend. Enfin et encore là ces messages d’erreur c’est quand j’ai créé une classe à part. A l’origine, j’avais mis ma classe dans ma jsp et c’était encore plus bizarre. Bref là j’ai ouvert Eclipse, foutu mon .java pour qu’il me compile une .class mais en fait je me demande s’il se fourvoit pas, j’ai l"impression qu’il cherche l’interface DataSource de java.sql (au vu des methodes qu’il veut me faire implémenter). Bref là je galère pour essayer que j2ee marche avec.
Enfin bon, sinon j’ai une autre solution en passant par me client mail par défaut. D’ailleur je trouve pas le code pour faire les sauts de ligne avec Lotus Note. Ca marche bien pour Outlook mais évidemment ca serait trop simple que le %0a soit compatible, il me fait des | . Bref c’est la merde :P. Faut que l’une ou l’autre solution marche demain soir
Ouiiiii c’est bon ca marche !! Bon en fait ca me gonfle un peu d’y avoir passer la journée, mais le mec avec qui je bosse (et qui doit m’apprendre le taff) m’avait pas pensé qu’il fallait redémarer Jboss pour que la classe soit prise en compte. Du coup une journée de taff passé sur un truc qui marchait.
Enfin c’est bon, c’est le principal !