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 :
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). |