Problema: Al realizar una transferencia de datos con urllib2 de Python, todos los datos se codifican con URL y se envían como Content-Type: application/x-www-form-urlencoded. Al cargar archivos, el tipo de contenido debe establecerse en multipart/form-data y los contenidos deben estar codificados en MIME. Una discusión de este problema está aquí: http://code.activestate.com/recipes/146306/Uso de MultipartPostHandler para POST datos de formulario con Python
Para superar esta limitación algunos codificadores afilados crearon una biblioteca llamada MultipartPostHandler que crea un OpenerDirector puede utilizar con urllib2 a POST su mayoría de forma automática con multipart/form-data. Una copia de esta biblioteca está aquí: http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html
Soy nuevo en Python y no puedo hacer que esta biblioteca funcione. Escribí esencialmente el siguiente código. Cuando lo capturo en un proxy HTTP local, puedo ver que los datos aún están codificados en URL y no tienen codificación MIME multiparte. Por favor, ayúdame a descubrir lo que estoy haciendo mal o una mejor manera de hacerlo. Gracias :-)
FROM_ADDR = '[email protected]'
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: Gracias por su respuesta. Conozco la solución ActiveState httplib para esto (me he vinculado a ella más arriba). Prefiero abstraer el problema y usar una cantidad mínima de código para seguir usando urllib2. ¿Alguna idea de por qué el abridor no se está instalando y utilizando?
¡Esto es exactamente lo que necesitaba! Prestigio. –
Sé que esta es una publicación anterior, pero obtengo esto del póster: 'AttributeError: multipart_yielder instance no tiene el atributo '__len __'' preguntándose si alguien más tiene este problema. – Andy
@nalroff No ha llamado 'poster.streaminghttp.register_openers()' –