Python - Problème urllib
Résolu/Fermé
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
-
6 août 2008 à 14:25
Choupichoup Messages postés 52 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 28 octobre 2009 - 7 août 2008 à 12:03
Choupichoup Messages postés 52 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 28 octobre 2009 - 7 août 2008 à 12:03
17 réponses
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
6 août 2008 à 15:26
6 août 2008 à 15:26
Quand tu fais ton POST, je ne vois pas le nom du champ contenant le fichier.
Dans un POST il doit être indiqué (tout comme tu le ferais dans un formulaire HTML).
Voici un exempl de POST:
https://sebsauvage.net/python/snyppets/index.html#http_post
D'autre part, tu devrais ouvrir ton fichier en "rb" et non en "r".
Dans un POST il doit être indiqué (tout comme tu le ferais dans un formulaire HTML).
Voici un exempl de POST:
https://sebsauvage.net/python/snyppets/index.html#http_post
#!/usr/bin/python import urllib,urllib2 url = 'http://www.commentcamarche.net/search/search.php3' parameters = {'Mot' : 'Gimp'} data = urllib.urlencode(parameters) # Use urllib to encode the parameters request = urllib2.Request(url, data) response = urllib2.urlopen(request) # This request is sent in HTTP POST page = response.read(200000)
D'autre part, tu devrais ouvrir ton fichier en "rb" et non en "r".
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
6 août 2008 à 17:28
6 août 2008 à 17:28
GET /yop2.txt HTTP/1.1
Ça, ça permet de récupérer le fichier yop2.txt fichier du serveur, pas d'en envoyer un vers le serveur.
Pour envoyer un fichier vers le serveur, il faut bien faire un POST, mais pas avec le nom du fichier comme URL.
Il faut le nom du programme sur le serveur qui va réceptionner la requête POST.
Ça, ça permet de récupérer le fichier yop2.txt fichier du serveur, pas d'en envoyer un vers le serveur.
Pour envoyer un fichier vers le serveur, il faut bien faire un POST, mais pas avec le nom du fichier comme URL.
Il faut le nom du programme sur le serveur qui va réceptionner la requête POST.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
7 août 2008 à 10:29
7 août 2008 à 10:29
Il y a un exemple là: http://code.activestate.com/recipes/146306/
Tu dois connaître:
* le nom du programme sur le serveur web qui reçoit les fichiers
* les paramètres qu'il accepte.
Il semble même que quelqu'un ait pensé à faire une librairie juste pour faire de l'upload de fichiers avec urllib2:
http://fabien.seisen.org/python/urllib2_multipart.html
Dans son exemple:
* le nom du programme sur le serveur qui reçoit les fichiers est script_upload.php
* le nom du champ contenant le fichier est 'file'
Tu dois connaître:
* le nom du programme sur le serveur web qui reçoit les fichiers
* les paramètres qu'il accepte.
Il semble même que quelqu'un ait pensé à faire une librairie juste pour faire de l'upload de fichiers avec urllib2:
http://fabien.seisen.org/python/urllib2_multipart.html
Dans son exemple:
* le nom du programme sur le serveur qui reçoit les fichiers est script_upload.php
* le nom du champ contenant le fichier est 'file'
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
6 août 2008 à 16:09
6 août 2008 à 16:09
Merci ! :)
Un autre problème se pose maintenant : urllib2.urlopen(url) est en 404 NOT FOUND, ce qui peut paraitre normal vu qu'il n'a pas créé le fichier, je n'ai pas trouvé de fonction qui créait le fichier préalablement pour éviter cette erreur.
Y en a-t-il une ?
Merci.
Un autre problème se pose maintenant : urllib2.urlopen(url) est en 404 NOT FOUND, ce qui peut paraitre normal vu qu'il n'a pas créé le fichier, je n'ai pas trouvé de fonction qui créait le fichier préalablement pour éviter cette erreur.
Y en a-t-il une ?
Merci.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
6 août 2008 à 16:11
6 août 2008 à 16:11
Normalement, l'URL ne soit pas être le nom du fichier, mais le nom du programme (sur le serveur web) qui va réceptionner et traiter le fichier.
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
6 août 2008 à 16:23
6 août 2008 à 16:23
Dans ce cas là le fichier n'a pas vraiment à être traité (ça peut être un .txt, .rar, .jpg ... ) : en gros je ne vois pas quel type de programme pourrait gérer tout ça... Il y a un programme qui traite tout ? Ou c'est un programme qui doit gérer uniquement l'envoi et caler le fichier dans le bon dossier ?
Merci.
J'ai modifié mon programme de tout à l'heure en :
Merci.
J'ai modifié mon programme de tout à l'heure en :
def sendFile(self, file_): url = "http://" + IP + "/" + file_ print "\n File sent to : " + file_ fileIn = open (PATH_LOC + '/' + file_, "rb") contenu = fileIn.read() try: request = urllib2.Request( url , contenu) handle = urllib2.urlopen( url ) print "contenu transfere: " print handle.read() except Exception: import traceback traceback.print_exc() fileIn.close() print "\n"
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
6 août 2008 à 16:25
6 août 2008 à 16:25
Où as-tu vu qu'il fallait lui envoyer un fichier de cette façon, dans la documentation du mobile ?
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
6 août 2008 à 16:26
6 août 2008 à 16:26
Je n'ai pas de documentation du mobile. Je suis en stage où je dois m'occuper des transferts de fichiers en python vers les mobiles type iPhone.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
6 août 2008 à 16:28
6 août 2008 à 16:28
Bon, sans documentation, c'est pas la peine. Tu ne peux pas taper à l'aveuglette en espérant faire mouche.
Il faut savoir comment envoyer ces fichiers.
Est-ce qu'il faut bien les envoyer sur un serveur HTTP ?
Si oui, sur quelle URL (http://ip/toto/titi.xxx) ?
En POST ou en GET ?
Avec quels paramètres de formulaire ?
Sans réponse à ces question, tu ne pourra pas le faire.
Il faut savoir comment envoyer ces fichiers.
Est-ce qu'il faut bien les envoyer sur un serveur HTTP ?
Si oui, sur quelle URL (http://ip/toto/titi.xxx) ?
En POST ou en GET ?
Avec quels paramètres de formulaire ?
Sans réponse à ces question, tu ne pourra pas le faire.
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
6 août 2008 à 16:35
6 août 2008 à 16:35
oui il faut envoyer sur un serveur HTTP, le fichier doit atterrir dans http://ip/lefichierenvoyé
jai un programme qui fait l'équivalent d'un GET qui fonctionne :
Qu'appelles-tu paramètres exactement ? Ma classe File, qui contient ces deux méthodes, ne prend aucun paramètre; dans un premier temps j'avais mis le port et l'ip mais je ne m'en servais pas vraiment. (IP et PATH_LOC sont issus d'un fichier de config). J'ai jamais bossé avec des serveurs HTTP ou autres donc je ne sais pas du tout de quoi il a besoin.
jai un programme qui fait l'équivalent d'un GET qui fonctionne :
def getFile(self, file_): """ to receive a file """ url = "http://" + IP + "/"+ file_ print "\n File received : " + url handle = urllib.urlopen (url) contenu = handle.read() print contenu fileOut = open (PATH_LOC + '/'+ file_, "w") fileOut.write (contenu) fileOut.close() print "\n"
Qu'appelles-tu paramètres exactement ? Ma classe File, qui contient ces deux méthodes, ne prend aucun paramètre; dans un premier temps j'avais mis le port et l'ip mais je ne m'en servais pas vraiment. (IP et PATH_LOC sont issus d'un fichier de config). J'ai jamais bossé avec des serveurs HTTP ou autres donc je ne sais pas du tout de quoi il a besoin.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
6 août 2008 à 16:43
6 août 2008 à 16:43
jai un programme qui fait l'équivalent d'un GET qui fonctionne :
Quant tu le fais en GET, ça marche ?
Qu'est-ce que tu passe dans l'URL du GET ?
Quant tu le fais en GET, ça marche ?
Qu'est-ce que tu passe dans l'URL du GET ?
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
6 août 2008 à 16:48
6 août 2008 à 16:48
Exactement la même chose que pour le POST : http://ip/lefichierenquestion
Et ça fonctionne très bien.
[ Quand je fais le POST le serveur repère bien qu'un POST a été fait mais le fichier arrive quand même vide. ]
Et ça fonctionne très bien.
[ Quand je fais le POST le serveur repère bien qu'un POST a été fait mais le fichier arrive quand même vide. ]
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
6 août 2008 à 16:50
6 août 2008 à 16:50
Quand tu fais http://ip/lefichierenquestion en GET, il n'y a aucun paramètre, donc tu ne lui envoie aucun fichier.
Quelle est l'URL complète du GET ?
(on doit y avoir un point d'interrogation suivi de paramètres, par exemple
https://www.google.fr/search?q=sebsauvage&gws_rd=ssl )
Quelle est l'URL complète du GET ?
(on doit y avoir un point d'interrogation suivi de paramètres, par exemple
https://www.google.fr/search?q=sebsauvage&gws_rd=ssl )
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
6 août 2008 à 16:56
6 août 2008 à 16:56
HTTP Server - A new client is connected
HTTP Server - Received request : GET /yop2.txt HTTP/1.1
Le serveur prend en paramètres l'ip du mobile et le port 80 en plus.
Il n'y a pas de '?' ou autre pris en compte.
HTTP Server - Received request : GET /yop2.txt HTTP/1.1
Le serveur prend en paramètres l'ip du mobile et le port 80 en plus.
Il n'y a pas de '?' ou autre pris en compte.
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
7 août 2008 à 09:56
7 août 2008 à 09:56
Ok... mais c'est quel genre de programme qui peut faire ça ? ça ressemble à quoi ce qu'il faut mettre dans la requête ?
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
7 août 2008 à 11:11
7 août 2008 à 11:11
Ok merci pour ton aide. Je vais essayer ça.
Bonne journée ! :)
Bonne journée ! :)
Choupichoup
Messages postés
52
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2009
4
7 août 2008 à 12:03
7 août 2008 à 12:03
Finalement problème résolu : serveur HTTP qui n'attendait pas d'avoir les données pour faire le POST...
Merci quand même j'ai appris pas mal de petits trucs grâce à tes liens !
Merci quand même j'ai appris pas mal de petits trucs grâce à tes liens !