Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

upload fichier par HTTP en POST

27 views
Skip to first unread message

mou...@igbmc.u-strasbg.fr

unread,
Sep 5, 2012, 6:58:38 AM9/5/12
to

Bonjour mes amis grenouilles,

Je cherche à uploader un fichier par http en POST. Les arguments à encoder (par formatQuery) sont :
file nomdufichier
db uniprotkb

Dans le cas présent, le fichier contient n lignes avec un mot par ligne.

j'ai juste trouvé un truc de 2005 sur le wiki.tcl.tk (http://wiki.tcl.tk/13675). Apparemment, il faut bidouiller le header, récupérer les données du fichier en binaire, ...
Depuis 2005, il doit y avoir une autre façon de faire ?

Merci d'avance !!
Luc

Frederic Bonnet

unread,
Sep 5, 2012, 4:20:03 PM9/5/12
to
Bonsoir,

j'ai juste une petite question :

Le 05/09/2012 12:58, luc.mo...@igbmc.fr a �crit :
>
> Je cherche � uploader un fichier par http en POST. Les arguments � encoder (par formatQuery) sont :
> file nomdufichier
> db uniprotkb
>
> Dans le cas pr�sent, le fichier contient n lignes avec un mot par ligne.

Pour envoyer des arguments en POST data, il faut utiliser -query. Mais
pour un upload de fichier on doit utiliser l'option -querychannel en lui
passant tout simplement l'ID du canal du fichier ouvert avec [open] et
le type MIME avec -type. Or les deux -query et -querychannel sont
mutuellement exclusifs.

Pour pouvoir � la fois poster des arguments et uploader un fichier, le
plus simple est de passer les arguments sous forme de query string dans
l'URL plut�t qu'en POST data. Ainsi :

set f [open nomdufichier]
set params [http::formatQuery file nomdufichier db uniprotkb]
http::geturl http://url/?$params -querychannel $f -type type_MIME
close $f


Je pense que �a devrait marcher. Le code que tu as trouv� doit dater
d'avant l'introduction de l'option -querychannel.

mou...@igbmc.u-strasbg.fr

unread,
Sep 6, 2012, 7:55:31 AM9/6/12
to
Merci ! en fait l'idée est que je connais dans mon programme le contenu du fichier. J'aimerai donc ne pas avoir à l'écrire pour après le relire pour le transmettre.
J'ai essayé le script du wiki et ça ne mrche pas.

Pour l'instant ta solution ne marche pas non plus, alors qu'un script Perl de démo marche, mais il faut que je cherche un peu au niveau des paramètres du header ...

Frederic Bonnet

unread,
Sep 6, 2012, 9:01:42 AM9/6/12
to
Le 06/09/2012 13:55, luc.mo...@igbmc.fr a �crit :
> Merci ! en fait l'id�e est que je connais dans mon programme le contenu du fichier. J'aimerai donc ne pas avoir � l'�crire pour apr�s le relire pour le transmettre.
> J'ai essay� le script du wiki et �a ne mrche pas.
>
> Pour l'instant ta solution ne marche pas non plus, alors qu'un script Perl de d�mo marche, mais il faut que je cherche un peu au niveau des param�tres du header ...

Donc si j'ai bien compris tu n'as pas � transf�rer le contenu du fichier
? Dans ce cas l'option -querychannel est inutile, il faut juste que tu
encodes les param�tres et que tu les passes � -query. Enfin je suppose :)

Il faudrait capturer le trafic de ton script Perl et voir quelles
diff�rences il peut y avoir avec ce que g�n�re le Tcl.


mou...@igbmc.u-strasbg.fr

unread,
Sep 6, 2012, 9:21:19 AM9/6/12
to
Pardon, j'ai du mal m'exprimer.
Le server attend un fichier, que je doit moi, client, lui envoyer par POST (upload). Je dis juste que je connais le contenu du fichier, j'aimerai ne pas avoir à faire :
- ecriture du fichier
- ouvrir le fichier , recuperer le channel
- envoie des donnes
- fermer et destruction du fichier.

On peut (et c'est ce que le script du wiki est censé coder) enoyer le contenur du fichier dans les balises "Content-*".

L'idée de snipper la sortie perl est bonne, mais je n'ai jamais fait de perl : voici le script qui marche :
Pour le lancer, cree un fichier contenant trois lignes :
sydc_human
p13368
Q55c99

puis : perl script <fichier>

Ou je serai super content si tu/quelqu'un pouvait m'expliquer comment snipper le traffic ?

Merci !!

use strict;
use warnings;
use LWP::UserAgent;

my $list = $ARGV[0]; # File containg list of UniProt identifiers.

my $base = 'http://www.uniprot.org';
my $tool = 'batch';
my $agent = LWP::UserAgent->new;
push @{$agent->requests_redirectable}, 'POST';
my $response = $agent->post("$base/$tool/",
[ 'file' => [$list],
'format' => 'txt',
],
'Content_Type' => 'form-data');

while (my $wait = $response->header('Retry-After')) {
print STDERR "Waiting ($wait)...\n";
sleep $wait;
$response = $agent->get($response->base);
}

$response->is_success ?
print $response->content :
die 'Failed, got ' . $response->status_line .
' for ' . $response->request->uri . "\n";






On Wednesday, September 5, 2012 12:58:38 PM UTC+2, luc.mo...@igbmc.fr wrote:

Frederic Bonnet

unread,
Sep 7, 2012, 5:01:12 AM9/7/12
to
Le 06/09/2012 15:21, luc.mo...@igbmc.fr a �crit :
> Pardon, j'ai du mal m'exprimer.
> Le server attend un fichier, que je doit moi, client, lui envoyer par POST (upload). Je dis juste que je connais le contenu du fichier, j'aimerai ne pas avoir � faire :
> - ecriture du fichier
> - ouvrir le fichier , recuperer le channel
> - envoie des donnes
> - fermer et destruction du fichier.
>
> On peut (et c'est ce que le script du wiki est cens� coder) enoyer le contenur du fichier dans les balises "Content-*".
>
> L'id�e de snipper la sortie perl est bonne, mais je n'ai jamais fait de perl : voici le script qui marche :
> Pour le lancer, cree un fichier contenant trois lignes :
> sydc_human
> p13368
> Q55c99
>
> puis : perl script <fichier>
>
> Ou je serai super content si tu/quelqu'un pouvait m'expliquer comment snipper le traffic ?

Si tu es sur Linux tu peux utiliser tcpdump par exemple :

tcpdump -s 0 -i any -w capture.pcap


Et ensuite tu peux ouvrir le fichier avec Wireshark.

Tu peux aussi capturer directement le trafic avec Wireshark sur Linux ou
Windows.

A partir de l� tu saurais quels sont les headers et le format des
donn�es que Perl envoie. Tu peux ensuite en d�duire les param�tres �
donner � Tcl pour obtenir le m�me r�sultat (notamment le header
Content-Type, Perl semble utiliser "form-data").

A++, Fred
0 new messages