Recreer une pièce jointe avec JavaMail

Recreer une pièce jointe avec JavaMail - Java - Programmation

Marsh Posté le 02-06-2006 à 09:55:12    

Bonjour all,
 
Je cherche à envoyer une pièce jointe à un webservice, grâce à un DataHandler. Pas de problème pour la partie cliente, qui ressemble à ça :
 

Code :
  1. public class WebServiceJavaTestor {
  2.   public static void main(String[] args) {
  3.     WebServiceJavaProxy p = new WebServiceJavaProxy();
  4.     try {
  5.       String filename = "image.jpg";
  6.       DataSource ds = new FileDataSource("C:\\temp\\source\\" + filename);
  7.       DataHandler dh = new DataHandler(ds);
  8.       System.out.println("Call to storeFile : " + p.storeFile(filename, dh));
  9.     } catch (RemoteException e) {
  10.       e.printStackTrace();
  11.     }
  12.   }
  13. }


 
Par contre la partie serveur doit fonctionner sur un serveur Domino 6.5, ce qui inclue un certain nombre de difficultés :
- java 1.3
- il faut tout parser à la main.
 
C'est donc ce que je fais. La requête que je reçoit ressemble à ça :
 

Citation :

------=_Part_0_14158819.1148988787982
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-Id: <B16DC35C0EB5DB244E8FB115971AAB01>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlnssd="http://www.w3.org/2001/XMLSchema" xmlnssi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<storeFile xmlns="http://webservicejava">
<filename>image.jpg</filename>
<dh href="cid:E790332A5CC67910DE669D376D0DBF23" xsi:type="ns1ataHandler" xmlns:ns1="http://xml.apache.org/xml-soap"/>
</storeFile>
</soapenv:Body>
</soapenv:Envelope>
------=_Part_0_14158819.1148988787982
Content-Type:image/jpeg
Content-Transfer-Encoding: binary
Content-Id: <E790332A5CC67910DE669D376D0DBF23>
Ï ÓJIF??? ?C?????? ???????????? $.\' \",#??(7),01444?
...
...
...
------=_Part_0_1


 
Bon j'arrive bien à séparer les deux parties et à parser la première pour récupérer le nom du fichier et le content ID, ce qui me permet d'aller récupérer le contenu à proprement parler dans la seconde partie.
 
Seulement mes essais pour recréer un DataHandler à partir du contenu ne fonctionnent que sur du texte, et pas sur des images ! Les images ainsi reçues (ou autre type de contenu un peu fun) ne sont pas exploitables.
 
Je vous mets quelques exemples de mes tentatives :
 
 

Code :
  1. String content = source.substring(begin, end).trim();
  2. // create the data handler from the content and the mime type  
  3. DataSource dataSource = new ByteArrayDataSource(content, contentType);
  4. DataHandler dh = new DataHandler(dataSource);
  5. FileOutputStream fos = new FileOutputStream("C:\\temp\\image.jpg" );
  6. dh.writeTo(fos);
  7. fos.close();


 
ou encore :
 

Code :
  1. // get a Session object  
  2. Session session = Session.getInstance(new Properties(), null);
  3. // create a mime message for the attachment part  
  4. byte[] sourceBytes = source.getBytes(); // todo : get the good charset  
  5. ByteArrayInputStream inputStream = new ByteArrayInputStream(sourceBytes);
  6. MimeMessage msg = new MimeMessage(session, inputStream);
  7. FileOutputStream out = new FileOutputStream("C:\\temp\\image.jpg" );
  8. msg.getDataHandler().writeTo(out);
  9. out.close();


 
Bref, tout ça ne marche pas, malheuresement, et je suis bien en galère. Vous pourriez m'aider SVP ?
 
Merci

Reply

Marsh Posté le 02-06-2006 à 09:55:12   

Reply

Marsh Posté le 05-06-2006 à 09:01:59    

Bon il marche pas trop mon topic. J'ai découvert que ce qui ne va pas, c'est la réception de la requête par le serveur Domino : il remplace tous les caractères spéciaux par des points d'exclamation. Impossible de recréer une pièce jointe avec ça...

Reply

Marsh Posté le 09-06-2006 à 14:58:24    

Pour les gens qui seraient coincés comme moi dans cette situation, je leur conseille de changer d'approche : utiliser une servlet, exécutée par le moteur de servlet de Domino (attention, c'est pas du dernier cri). L'objet HttpServletResponse, passé en paramètre de doGet (ou doPost), permet de récupérer le contenu du message sans modification de l'encodage (sous forme de Stream du moins).

Reply

Marsh Posté le 09-06-2006 à 15:35:00    

Hey, juste un truc, ta pièce jointe tu dois l'encoder en base64 et pas en binaire, pq c'est clair que les caractères spéciaux ne passsent pas sur le réseau...


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 22-06-2006 à 14:46:08    

Merci pour l'info m'sieur, désolé j'avais pas vu ta réponse. Pour le coup j'ai tout fait avec SAAJ (SOAP with Attachment API for Java), qui évite de parser à la main.
De manière générale, il faut effectivement encoder en base64 et manipuler des flux pour éviter les emmerdes sur des string.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed