Problem: Podczas zapisywania danych za pomocą urllib2 w Pythonie wszystkie dane są zakodowane i wysyłane jako Content-Type: application/x-www-form-urlencoded. Podczas przesyłania plików typ zawartości powinien być ustawiony jako wieloczęściowy/formularz-dane, a treść musi być zakodowana MIME. Omówienie tego problemu jest tutaj: http://code.activestate.com/recipes/146306/Używanie MultipartPostHandler do POST-danych formularzy z Pythonem
Aby obejść to ograniczenie, niektóre ostre programistów stworzył bibliotekę o nazwie MultipartPostHandler który tworzy OpenerDirector można korzystać z urllib2 się przeważnie automatycznie post z multipart/form-data. Kopia tej biblioteki znajduje się tutaj: http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html
Jestem nowicjuszem w Pythonie i nie mogę uruchomić tej biblioteki. Zasadniczo napisałem poniższy kod. Kiedy przechwytywam je w lokalnym proxy HTTP, widzę, że dane są nadal zakodowane za pomocą adresu URL, a nie wieloczęściowe kodowanie MIME. Proszę pomóż mi dowiedzieć się, co robię źle lub lepszy sposób, aby to zrobić. Dzięki :-)
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: Dzięki za odpowiedź. Zdaję sobie sprawę z tego rozwiązania HTTP na platformie ActiveState (dołączyłem do tego powyżej). Wolałbym usunąć problem i użyć minimalnej ilości kodu, aby nadal używać urllib2, jak byłem. Każdy pomysł, dlaczego otwieracz nie jest instalowany i używany?
To jest dokładnie to, czego potrzebowałem! Sława. –
Wiem, że jest to stary post, ale otrzymuję to z plakatu: 'AttributeError: instancja multipart_yielder nie ma atrybutu" __len __ ", zastanawiając się, czy ktoś inny ma ten problem. – Andy
@nalroff Nie nazwałeś 'poster.streaminghttp.register_openers()' –