[CODE] Envoyer un fichier en POST à une page web ?

Voilà, pour automatiser certaines tâches dans un soft, j’appele des pages web specifiques en leur envoyant des données POST qu’elles traitent ensuite (pour ceux qui font du php, j’appele la page en ‹ placant › du contenu dans la variable $_POST, pour faire gros et approximatif).

Maintenant, j’aimerai améliorer ce système, en évitant une étape de plus de à l’utilisateur, en me chargeant de l’upload d’un fichier de donnée jusque là chargé manuellement par une page web.

Et je suis incapable de trouver comment envoyer les fichiers comme le fait une page web dans les données POST …

le code que j’utilise jusque là est basé sur cet exemple (oui, c’est du delphi, mais quel que soit le langage ça reveint au même, et le niveau du code est assez faible :stuck_out_tongue: ) :

[code]var
strData: string;
PostData: OleVariant;
Headers: OleVariant;
i: Integer;
begin
{1. you must create a string with parameter names and values
Result string must be in the next format:
Param1=Value1&Param2=Value2&Param3=Value3…}
strData := ‹ Param1Name= › + HTTPEncode(Param1Value) + ‹ & › +
‹ Param2Name= › + HttpEncode(Param2Value) + …;

{2. you must convert a string into variant array of bytes and
every character from string is a value in array}
PostData := VarArrayCreate([0, Length(strData) - 1], varByte);

{ copy the ordinal value of the character into the PostData array}
for i := 1 to Length(strData) do
PostData[i-1] := Ord(strData[i]);

{3. prepare headers which will be sent to remote web-server}
Headers := ‹ Content-Type: application/x-www-form-urlencoded › + #10#13;

{4. you must navigate to the URL with your script and send as parameters
your array with POST-data and headers}

//parametre : url, flags, frame cible, données POST, headers
yourWebBrowserComponent.Navigate(‹ http://www.yourdomain.com/your_post_script.asp ›, EmptyParam, EmptyParam, PostData, Headers);
end;[/code]

Pour envoyer un fichier, déjà je me suis dit rapport à mon expérience avec PHP qu’il fallait changer le header pour ‹ Content-Type: multipart/form-data ›.
Erreur ! Les données POST ne sont plus envoyées…

De plus, ça ne me dit pas où et comment envoyer ce fichu fichier.

Une autre solution beaucoup moins élégante serait de le lire et de l’envoyer en tant que variable dans POST, mais ça me semble un peu lourdingue quand même, et il doit surement avoir une limite (les fichiers en question peuvent monter a 200 ko …)

Du coup je bloque et je demande votre aide …
Si vous savez faire ça, quel que soit le langage et que vous avez un bout de code uqi marche, ou que vous pouvez m’aider à trouver comment fraire, je suis preneur.

Merci

PS : je n’ai pas mis de tag pour la simple raison que mon code n’est pas spécifique delphi, et que je ne vois pas quoi lui mettre …

Ca m’intéresse aussi, j’avais voulu le faire en perl et je n’avais pas trouvé comment faire (bon je n’y avais pas passé des heures non plus :P)

2 ptites minutes de google m’ont donné ce lien. J’ai pas vraiment pris le temps de regarder en détail si ca colle parfaitement à ce que tu cherche à faire. Au pire, t’a le lien vers la RFC qui va bien sur la page :stuck_out_tongue:

Ok, je vais me coucher ;p
Merci bishop

Okay alors en traficotant dans diverses RFC etc j’ai finit par trouver, du coup je vais le filer ici.

Le Header “Content-Type: application/x-www-form-urlencoded” signifie qu’on va envoyer nos données POST sous la forme paramètre1=valeur1&paramètre2=valeur2&…

Comme en GET dans l’url sauf que là c’est en POST dans les données POST donc.

Ca, ca fonctionne très bien (attention, les données POST doivent être formatées au format html, d’où l’utilisation de httpencode plus haut).

Par contre si vous voulez y adjoindre un fichier, cette méthode n’est pas bonne.

Il faut passer par la méthode “multipart/form-data; boundary=---------------------------45f1s34z6r78s”

Ce qu’il y a après le boundary, c’est une chaîne que vous spécifiez, qui va servir à délimiter les éléments dans vos données POST.
Je ne sais pas si on est libre de la générer comme on le souhaite, pour ma part je me sers de :
Result := ‘---------------------------’ + FormatDateTime(‘mmddyyhhnnsszzz’, Now);

Et ça fonctionne très bien.

Ensuite, vous formatez les informations pour qu’elles correspondent à ce screen (désolé je n’ai pas le temps de faire un truc propre sur le format) :
Comme vous le voyez le boundary délimite les éléments (là j’ai mis deux variables POST et un fichier).

Après le dernier boundary, on place deux tirets.

En espérant que ça aide.

[quote=« Coldorak, post:4, topic: 26974 »]Ok, je vais me coucher ;p
Merci bishop[/quote]

Huhu, désolé, j’avais pas vu qu’il avait laissé ta citation. J’ai cliqué sur un bouton « répondre » sans faire gaffe vu que j’étais pressé tt a l’heure. Y avait aucune intention de te faire remarquer que c’était tout con a trouver :stuck_out_tongue: (parce que j’ai l’impression que tu l’a compris comme ca)