2013-08-12 11 views
15

pytona requests module zapewnia dobrą dokumentację, w jaki sposób przesłać pojedynczy plik w jednym życzenie:przesyłanie wielu plików w jednym żądaniu użyciu żądań Pythona moduł

files = {'file': open('report.xls', 'rb')} 

próbowałem rozszerzenie tego przykład za pomocą tego kodu w sposób próbować przesłać kilka plików:

files = {'file': [open('report.xls', 'rb'), open('report2.xls, 'rb')]} 

ale to spowodowało ten błąd:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py",  line 1052, in splittype 
match = _typeprog.match(url) 
TypeError: expected string or buffer 

Czy można przesłać listę plików w jednym żądaniu za pomocą tego modułu i jak?

+1

dlaczego tam nie było akceptowaną odpowiedź? Czy odpowiedź na poniższe pytanie nie jest wystarczająca? –

+0

Ping/bumping. Czy wystarczy jedna z tych odpowiedzi? –

Odpowiedz

11

Wiele plików z różnymi wartościami kluczowymi mogą być przesłane przez dodanie wielu w słowniku:

files = {'file1': open('report.xls', 'rb'), 'file2': open('otherthing.txt', 'rb')} 
r = requests.post('http://httpbin.org/post', files=files) 
+0

Interesujące. Spróbuję Twojego podejścia. Powodem, dla którego wypróbowałem listę, było to, że Flask (framework sieci Pythona) mówi, że pliki są wielodyscyplinarne, a sposób dostępu do wszystkich plików to: request.files.getall ('file') – user462455

16

Aby przesłać listę plików o tej samej wartości klucza w jednym wniosku, można utworzyć listę krotek z pierwszy element każdej krotki jako wartość klucza i obiektu pliku jako drugi:

files = [('file', open('report.xls', 'rb')), ('file', open('report2.xls', 'rb'))] 
+0

Po angielsku. – lpapp

7

documentation zawiera jasną odpowiedź.

Cyt:

You can send multiple files in one request. For example, suppose you want to upload image files to an HTML form with a multiple file field ‘images’:

To do that, just set files to a list of tuples of (form_field_name, file_info):

url = 'http://httpbin.org/post' 
multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')), 
         ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))] 
r = requests.post(url, files=multiple_files) 
r.text 

# { 
# ... 
# 'files': {'images': 'data:image/png;base64,iVBORw ....'} 
# 'Content-Type': 'multipart/form-data; boundary=3131623adb2043caaeb5538cc7aa0b3a', 
# ... 
# } 
+0

Jaką formę może przyjąć file_info? Czy mogę pominąć typ zawartości? Co jeszcze może być częścią file_info? dokumentacja nie wchodzi w szczegóły. –

+0

@AmauryRodriguez Polecam spojrzeć na źródło wszystkich tych szczegółów. –

Powiązane problemy