Datei-Upload mit multipart/form-data und urllib2

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Hallo Leute,

ich versuche im Moment eine kleine lib für die API des Box.net Cloud-Dienstes zu erstellen. Die haben eine REST-API und bisher bin ich soweit, dass die Anmeldung funktioniert. Um mit den Dateien zu arbeiten, wird aber cURL verwendet, das klappt bei einfachen Sachen wie dem Abfragen von Infos auch noch, weil dort nur ein Header dazu muss jetzt hab ich aber folgendes:

Code: Alles auswählen

curl https://www.box.com/api/2.0/files/data \
-H "Authorization: BoxAuth api_key=API_KEY&auth_token=AUTH_TOKEN" \
-F filename=@FILE_NAME \
-F folder_id=FOLDER_ID
Das -H für Header is auch noch klar. Aber die -F sind ja multipart/form-data Sachen. Und da weiß ich genau GAR NICHT, wie ich die hinzufüge, scheinbar ja mit add_data - laut der Doc, jedoch werd ich daraus gar nicht schlau.

Bisher hab ich es so versucht:

Code: Alles auswählen

import urllib2

url = 'https://www.box.com/api/2.0/folders/0'
auth = "BoxAuth api_key=<MEIN KEY>&auth_token=<MEIN TOKEN>"

req = urllib2.Request(url)
req.add_header("Authorization", auth)
req.add_header("Content-Type", "multipart/form-data") # k.a. ob's hilft
req.add_data("filename = @/home/user/Bilder/wazapp_bbz.jpg, folder_id=0")
result = urllib2.urlopen(req)
result = result.read()

print result
Aber ich hab eben keine Ahnung wie das "data" richtig hizugefügt wird/werden muss.

Über hilfe wäre ich sehr froh, Danke schon im Vorraus!

AlphaX2
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Lass dir dein data einfach zusammen bauen.

Das kann `urllib.urlencode({"bla":"blub", "foo":"bar"})`für dich machen.
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Danke für die rasche Antwort.

EDIT: Vorhin war mit einer falschen URL, trotzdem kommt der Fehler, der Link sollte aber stimmen, denn über die Konsole läuft cURL super:

Code: Alles auswählen

Traceback (most recent call last):
  File "boxtest.py", line 15, in <module>
    result = urllib2.urlopen(req)
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 406, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 444, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found
Ideen? Also zumindest ist es schon richtig -F von cURL auf diese Weise überhaupt zu übergeben?

Danke, AlphaX2
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Hmm fragt sich nur noch was der beste Weg ist? :K

Vielen Dank zumindest für die reichlichen Hinweise und Vorschläge!

AlphaX2
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

AlphaX2 hat geschrieben:Hmm fragt sich nur noch was der beste Weg ist? :K
Requests :!: :)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Sieht fast so aus - angenehm einfach jedenfalls. Jetzt überlege ich auch die schon bestehenden (lies: implementiert mit urllib2) Anteile auf Requests umzustellen. ;)

AlphaX2
Antworten