Piszę kod do interfejsu z redmine i muszę przesłać niektóre pliki w ramach procesu, ale nie jestem pewien, jak wykonać żądanie POST z Pythona zawierające plik binarny.Python POST dane binarne
Próbuję naśladować polecenia here:
curl --data-binary "@image.png" -H "Content-Type: application/octet-stream" -X POST -u login:password http://redmine/uploads.xml
W python (poniżej), ale nie wydają się działać. Nie jestem pewien, czy problem jest w jakiś sposób związany z kodowaniem pliku lub jeśli coś jest nie tak z nagłówkami.
import urllib2, os
FilePath = "C:\somefolder\somefile.7z"
FileData = open(FilePath, "rb")
length = os.path.getsize(FilePath)
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, 'http://redmine/', 'admin', 'admin')
auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
request = urllib2.Request(r'http://redmine/uploads.xml', FileData)
request.add_header('Content-Length', '%d' % length)
request.add_header('Content-Type', 'application/octet-stream')
try:
response = urllib2.urlopen(request)
print response.read()
except urllib2.HTTPError as e:
error_message = e.read()
print error_message
Mam dostęp do serwera i wygląda błędu kodowania:
...
invalid byte sequence in UTF-8
Line: 1
Position: 624
Last 80 unconsumed characters:
7z¼¯'ÅÐз2^Ôøë4g¸R<süðí6kĤª¶!»=}jcdjSPúá-º#»ÄAtD»H7Ê!æ½]j):
(further down)
Started POST "/uploads.xml" for 192.168.0.117 at 2013-01-16 09:57:49 -0800
Processing by AttachmentsController#upload as XML
WARNING: Can't verify CSRF token authenticity
Current user: anonymous
Filter chain halted as :authorize_global rendered or redirected
Completed 401 Unauthorized in 13ms (ActiveRecord: 3.1ms)
Nie mam pojęcia dlaczego, ale używając modułu żądania, ten sam kod działa dobrze ... Wielkie dzięki. Chociaż teraz jestem bardzo ciekawy, dlaczego urllib nie działa ... – Mac