Problème: Lors de l'Affichage de données avec Python urllib2, toutes les données sont codées dans l'URL et envoyé en tant que Content-Type: application/x-www-form-urlencoded. Lors du téléchargement de fichiers, le Type de Contenu devrait plutôt être défini comme " multipart/form-data et le contenu au format MIME. Une discussion de ce problème est ici: http://code.activestate.com/recipes/146306/
Pour contourner cette limitation, des codeurs créé une bibliothèque appelée MultipartPostHandler qui crée un OpenerDirector vous pouvez utiliser avec urllib2 la plupart du temps de publier automatiquement avec multipart/form-data. Une copie de cette bibliothèque est ici: http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html
Je suis nouveau sur le Python et n'arrive pas à obtenir cette bibliothèque pour travailler. J'ai écrit, pour l'essentiel, le code suivant. Quand je capture dans un local proxy HTTP, je peux voir que les données sont codées dans l'URL et pas de multi-partie au format MIME. Merci de m'aider à comprendre ce que je fais de mal ou une meilleure façon d'obtenir ce fait. Merci :-)
FROM_ADDR = 'my@email.com'
try:
data = open(file, 'rb').read()
except:
print "Error: could not open file %s for reading" % file
print "Check permissions on the file or folder it resides in"
sys.exit(1)
# Build the POST request
url = "http://somedomain.com/?action=analyze"
post_data = {}
post_data['analysisType'] = 'file'
post_data['executable'] = data
post_data['notification'] = 'email'
post_data['email'] = FROM_ADDR
# MIME encode the POST payload
opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler)
urllib2.install_opener(opener)
request = urllib2.Request(url, post_data)
request.set_proxy('127.0.0.1:8080', 'http') # For testing with Burp Proxy
# Make the request and capture the response
try:
response = urllib2.urlopen(request)
print response.geturl()
except urllib2.URLError, e:
print "File upload failed..."
EDIT1: Merci pour votre réponse. Je suis conscient de la ActiveState httplib solution (j'ai lié ci-dessus). Je préfère abstraction du problème et utiliser une quantité minimale de code de continuer à utiliser urllib2 la façon dont je l'ai été. Aucune idée de pourquoi l'ouvreur n'est pas installé et utilisé?