Upload et download de fichiers avec un web service

18 novembre 2007 par Florent Garin Laisser une réponse »

Comment faire pour « uploader » et « downloader » un fichier vers et depuis un web service ?
Très simple me diriez-vous et depuis longtemps. Il suffit d’utiliser SAAJ (SOAP with Attachments API for Java) ou encore mieux MTOM (Message Transmission Optimization Mechanism) pour bénéficier de l’assurance d’une compatibilité .Net/Java optimale.
En théorie cela semble simple mais quand on passe à la pratique, dans le contexte d’une application réelle, les choses se compliquent bigrement, en tout cas en ce qui concerne l’implémentation de JAXWS.
La plus grosse lacune de JAXWS au niveau MTOM est son incapacité à transmettre les données binaires sous forme de flux de bout en bout. Comme expliqué ici il est bien possible d’indiquer au client d’utiliser le mode « streaming » mais côté serveur rien à faire, l’ensemble des octets constituant le fichier est monté en mémoire.
Même côté client, JAXWS mériterait quelques améliorations. En effet il n’est pas possible de superviser la progression du transfert, de plus le mode « streaming » opère en appelant HttpURLConnection.setChunkedStreamingMode sur la connexion sous-jacente ce qui pose des problèmes car de nombreux serveurs web ou proxy ne supportent pas ce mode. Il serait intéressant que JAXWS calcule la taille du contenu à poster et invoque plutôt la méthode HttpURLConnection.setFixedLengthStreamingMode.

Conclusion de tout cela, pour uploader un fichier en http rien ne vaut d’utiliser directement HttpURLConnection et d’implémenter le basique et standard upload multipart/form-data.

Bookmark and Share

5 commentaires

  1. Alexis MP dit :

    Bonjour Florent.
    Est-ce qu’il s’agit d’un problème de performance? JAX-WS 2.1.3 apporte le mimepull: http://weblogs.java.net/blog/jitu/archive/2007/10/introducing_mim.html

  2. Florent Garin dit :

    Salut Alexis. Effectivement, mimepull semble intéressant, cette librairie permet d’accéder aux attachements mime sous forme de flux. Mais qu’en est-il des attachements XOP (XML-binary Optimized Packaging) véhiculés par MTOM ?

  3. Florent Garin dit :

    quelques précisions:
    Jaxws devrait supporter le transfert de fichier large avec MTOM.
    La question est de savoir quand le bug suivant
    sera t-il corrigé ? Vraisemblablement à partir de la version 2.1.3 de jaxws.

    Une fois ce bug corrigé, nous réévaluerons sérieusement le couple jaxws + MTOM pour le transfert des fichiers au sein de DocDoku.

    Transférer des fichiers avec une API bas niveau « HttpURLConnection » est une solution de contournement temporaire bien moins intégrée que jaxws + MTOM.

  4. Matt dit :

    et Axis2, sais-tu comment il se comporte ?

  5. Florent Garin dit :

    Je n’ai pas eu l’occasion de tester en profondeur Axis2, seulement quelques exemples simples lors de formations que j’animais.
    Par contre, j’ai très récemment étudié CXF (choix client) qui implémente l’API JAXWS et est MTOM compliant.
    CXF véhicule correctement les larges pièces jointes (j’ai testé avec des fichiers de près de 500Mo).
    CXF cache les données binaires dans un fichier temporaire, évitant ainsi de surcharger la mémoire.
    Enfin, on peut noter que le bug de JAXWS-RI est depuis quelques jours passé à « RESOLVED ».

Laisser un commentaire