Upload et download de fichiers avec un web service

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.

10 Commentaires

  1. 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 Author

    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 Author

    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

    et Axis2, sais-tu comment il se comporte ?

  5. Florent Garin Author

    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 ».

  6. Do you mind if I quote a couple of your articles as long asI provide credit and sources back to your website?My blog site is in the very same niche as yours and my users would certainly benefit from some of the information you present here.Please let me know if this okay with you. Thanks!

  7. Thanks for sharing. I read many of your blog posts, cool, your blog is very good. https://accounts.binance.com/ka-GE/register?ref=S5H7X3LP

  8. I don’t think the title of your article matches the content lol. Just kidding, mainly because I had some doubts after reading the article. https://www.binance.com/uk-UA/register?ref=GJY4VW8W

  9. Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me? https://www.binance.com/sv/join?ref=V3MG69RO

  10. Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me. https://accounts.binance.com/es/register?ref=T7KCZASX

Comments are closed.