2013-08-12 9 views
15

il pitone requests module fornisce una buona documentazione su come caricare un singolo file in una singola richiesta:Caricamento di più file in una sola richiesta utilizzando le richieste di pitone modulo

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

ho provato estendere tale esempio utilizzando questo codice in un tentare di caricare più file:

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

ma si è tradotto in questo errore:

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 

E 'possibile caricare un elenco di file in una singola richiesta usando questo modulo, e come?

+1

perché non è ci stato un risposta accettata? Non è sufficiente la risposta dall'alto in basso? –

+0

Ping/Bumping. Qualcuno di queste risposte è sufficiente? –

risposta

11

file multipli con diversi valori chiave possono essere caricati aggiungendo più voci del dizionario:

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

Interessante. Proverò il tuo approccio. Il motivo per cui ho provato la lista è stato perché Flask (python web framework) dice che i file sono un multidict e il modo per accedere a tutti i file di caricamento sarebbe: request.files.getall ('file') – user462455

16

per caricare un elenco di file con lo stesso valore chiave in una singola richiesta, è possibile creare una lista di tuple con la prima voce in ogni tupla come il valore della chiave e l'oggetto file come il secondo:

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

inglese per favore. – lpapp

7

il documentation contiene una risposta chiara.

Citato:

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

Quale forma può assumere file_info? Posso omettere il tipo di contenuto? Cos'altro può far parte di file_info? la documentazione non entra nei dettagli. –

+0

@AmauryRodriguez Vi consiglio di guardare la fonte per tutti quei dettagli. –

Problemi correlati