Seite 1 von 1

Datei-Upload mit multipart/form-data und urllib2

Verfasst: Sonntag 19. August 2012, 14:24
von AlphaX2
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

Re: Datei-Upload mit multipart/form-data und urllib2

Verfasst: Sonntag 19. August 2012, 17:07
von Sr4l
Lass dir dein data einfach zusammen bauen.

Das kann `urllib.urlencode({"bla":"blub", "foo":"bar"})`für dich machen.

Re: Datei-Upload mit multipart/form-data und urllib2

Verfasst: Sonntag 19. August 2012, 17:17
von AlphaX2
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

Re: Datei-Upload mit multipart/form-data und urllib2

Verfasst: Sonntag 19. August 2012, 18:07
von deets
urllib2 kann kein multipart von Haus aus.

Guckst du hier:

http://stackoverflow.com/questions/6803 ... ith-python

Re: Datei-Upload mit multipart/form-data und urllib2

Verfasst: Sonntag 19. August 2012, 18:46
von lunar
@AlphaX2 requests unterstützt Multipart.

Re: Datei-Upload mit multipart/form-data und urllib2

Verfasst: Sonntag 19. August 2012, 19:15
von AlphaX2
Hmm fragt sich nur noch was der beste Weg ist? :K

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

AlphaX2

Re: Datei-Upload mit multipart/form-data und urllib2

Verfasst: Sonntag 19. August 2012, 19:58
von Hyperion
AlphaX2 hat geschrieben:Hmm fragt sich nur noch was der beste Weg ist? :K
Requests :!: :)

Re: Datei-Upload mit multipart/form-data und urllib2

Verfasst: Sonntag 19. August 2012, 20:52
von AlphaX2
Sieht fast so aus - angenehm einfach jedenfalls. Jetzt überlege ich auch die schon bestehenden (lies: implementiert mit urllib2) Anteile auf Requests umzustellen. ;)

AlphaX2