SORU
25 Mart 2009, ÇARŞAMBA


Kullanarak Python ile form-data göndermek için MultipartPostHandler

Sorun: Python ile veri gönderirken tüm veri URL olarak kodlanmış ve İçerik-Türü: gönderilen urllib2, uygulama/x-www-form-urlencoded. Dosyaları yüklerken, İçerik-Türü < /form-data parçalı ayarlanmalıdır yerine ve içeriğini MIME kodlanmış. Bu sorun, bir tartışma burada: http://code.activestate.com/recipes/146306/

Bu sınırlama kurtulmak için keskin bir kodlama kütüphane urllib2 ile çoğunlukla otomatik olarak parçalı/ile göndermek için kullanabileceğiniz bir OpenerDirector-veri formu oluşturur MultipartPostHandler denilen yarattı. Bu kütüphane bir kopyasını burada: http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html

Python için yeni duyuyorum ve çalışmak bu kütüphane alamıyor. Dışarı aslında aşağıdaki kodu yazdım. Ben yerel bir HTTP proxy olarak yakalama verileri hala URL olarak kodlanmış bakın parçalı ve çok MIME kodlanmış değil. Beni yanlış ne yaptığımı anlamaya yardımcı olmak veya bu işi halletmek için daha iyi bir yol lütfen. - Teşekkürler)

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..."

EDİT1: yanıtınız için Teşekkür ederim. Bu (yukarıda bağlantılı) ActiveState httplib çözüm farkındayım. Oldukça uzakta sorun soyut ve en az miktarda kod nasıl urllib2 kullanarak devam etmek için kullanmak istiyorum. Açacağı yüklü ve kullanılmıyor neden herhangi bir fikir?

CEVAP
27 Mart 2009, Cuma


Bu sorunu aşmanın en uyumlu en kolay yolu kullanacak gibi görünüyor 'poster' modülü.

# test_client.py
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2

# Register the streaming http handlers with urllib2
register_openers()

# Start the multipart/form-data encoding of the file "DSC0001.jpg"
# "image1" is the name of the parameter, which is normally set
# via the "name" parameter of the HTML <input> tag.

# headers contains the necessary Content-Type and Content-Length
# datagen is a generator object that yields the encoded parameters
datagen, headers = multipart_encode({"image1": open("DSC0001.jpg")})

# Create the Request object
request = urllib2.Request("http://localhost:5000/upload_image", datagen, headers)
# Actually do the request, and get the response
print urllib2.urlopen(request).read()

Bu mükemmel çalıştı ve httplib ile karıştırmak zorunda değildim. Modülü mevcuttur: http://atlee.ca/software/poster/index.html

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alfredo Garcia

    Alfredo Garc

    25 Mayıs 2007
  • BioHunta

    BioHunta

    28 Mayıs 2006
  • TomKNJ

    TomKNJ

    26 ŞUBAT 2007