Pour envoyer des fichiers (textes, binaires, images...) à un webservice REST, il est courant d'avoir un code du type :

 

cMaRequete est un restRequête
cMaRequete..Méthode = httpPost
cMaRequete..URL = "http://ServeurDestination/UrlWebServiceRest/.../FinURL"
cMaRequete..Contenu = fChargeBuffer("C:\...\FichieraUploade.bin")
RESTEnvoie(cMaRequete)

 

Cette solution impose de charger en mémoire le contenu du fichier à envoyer au webservice. Elle convient donc parfaitement pour un seul fichier, n'excédant pas quelques mégas. Par contre lorsque le transfert est volumineux, ou s'il est fait depuis un appareil limité en mémoire, une autre solution est préconisée. Il s'agit de faire l'envoi en "multi-part", avec le principe de formulaire. En effet, de cette manière le transfert avec le serveur qui héberge le webservice sera automatiquement géré par bloc, sans chargement complet en mémoire :

 

ApiRest est un httpRequête
HTTPCréeFormulaire("FORM")
HTTPAjouteParamètre("FORM", "parametres"...)
HTTPAjouteFichier("FORM", "fichier_upload", "C:\...\FichieraUploade.bin")
ApiRest..URL = "http://ServeurDestination/UrlWebServiceRest/.../FinURL"
ApiRest..Méthode =httpPost
ApiRest..ContentType =typeMimeFormulaireMultiPartie
RetourApiRest = HTTPEnvoieFormulaire("FORM", ApiRest)

 

Avec cette solution qui s'applique que l'application cliente qui consomme le webservice soit sous Windows, Android, iOS :

  • plusieurs fichiers peuvent être envoyés dans une même requête, il suffit de répéter les appels de HTTPAjouteFichier.
  • un suivi du transfert avec une jauge est permis avec la propriété AvancementTéléchargement du type httpRequête,
  • un transfert asynchrone est autorisé à partir de la version 26, grâce à la syntaxe asynchrone de la fonction HTTPEnvoieFormulaire.

 

Au passage, pour le cas inverse du téléchargement d'un fichier par une requpête HTTP, il est également possible d'avoir un remplissage continu d'un fichier créé par l'application cliente. Le téléchargement doit pour cela être fait soit :

Ces deux solutions évitent de récupérer le contenu complet de la réponse HTTP pour la stocker localement par un fSauveBuffer. A noter qu'un exemple complet de téléchargement HTTP incluant une reprise sur panne est proposé dans la LST 108 WD Téléchargement Partiel.

 

Mise à jour 9/9/2021

Précision sur le "côté serveur" dans le cas d'un envoi :

  • depuis le client en "typeMimeFormulaireMultiPartie" avec HTTPAjouteFichier,
  • et avec une réception par un webservice REST en WLangage hébergé par le serveur d'application de WEBDEV :

Dans ce cas c'est le serveur d'application qui va gérer la réception. Le webservice ne va donc pas recevoir un buffer avec le fichier, mais un nom temporaire du fichier sur le disque du serveur. Si le webservice est en WLangage sur le serveur, la procédure de réception du fichier devra donc faire :

sNomFichier,sNomCompletTemporaire sont des chaînes
(sNomFichier,sNomCompletTemporaire)=ChaîneDécoupe(WebserviceParamètre("fichier_upload"),";")

La variable sNomCompletTemporaire contiendra le chemin complet vers le fichier sauvé sur le serveur. Il pourra par exemple être copié vers l'emplacement voulu, ou stocker dans la base de données ...

A noter que le serveur web peut avoir des restrictions sur la taille des requêtes qu'il accepte d'échanger. Dans IIS, partie "Filtrage des demandes", "paramètres de filtrages des demandes", il peut être nécessaire d'ajuster la taille maximale des demandes (et donc des uploads).

< Retour

2 commentaires

bruno abratanski
24/03/2021 - 17:08 - Répondre
Bonjour, Très intéressant cet article Guillaume. L'option existe pour télécharger des gros fichiers ? Si oui comment ? Merci

Guillaume BAYLE
25/03/2021 - 17:51 - Répondre
Bonjour, j'ai complété le billet des solutions pour optimiser à l'identique le téléchargement. Bons développements !

Publier un commentaire : 
Votre adresse email ne sera pas publiée