Загрузка нескольких файлов с использованием того же имени ввода в django

У меня возникли проблемы с загрузкой нескольких файлов с одним и тем же именем:

<input type=file name="file">
<input type=file name="file">
<input type=file name="file">

на стороне django

print request.FILES :

<MultiValueDict: {u'file': [
<TemporaryUploadedFile: captcha_bg.jpg (image/jpeg)>,
<TemporaryUploadedFile: 001_using_git_with_django.mov (video/quicktime)>,
<TemporaryUploadedFile: ejabberd-ust.odt (application/vnd.oasis.opendocument.text)>
]}>

поэтому все три файла находятся под одним запросом. FILES ['file'] объект. как я могу обрабатывать файлы, загруженные здесь?

Ответы

Ответ 1

for f in request.FILES.getlist('file'):
    # do something with the file f...

EDIT: Я знаю, что это был старый ответ, но я наткнулся на него только сейчас и отредактировал ответ на самом деле. Ранее предполагалось, что вы можете выполнять итерацию непосредственно над request.FILES['file']. Чтобы получить доступ ко всем элементам в MultiValueDict, вы используете .getlist('file'). Использование только ['file'] будет возвращать только последнее значение данных, которое он находит для этого ключа.

Ответ 2

Учитывая, что ваш url указывает на envia, вы можете управлять несколькими файлами, такими как:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from django.http import HttpResponseRedirect

def envia(request):
    for f in request.FILES.getlist('file'):
        handle_uploaded_file(f)
    return HttpResponseRedirect('/bulk/')

def handle_uploaded_file(f):
    destination = open('/tmp/upload/%s'%f.name, 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()

Ответ 3

Я не думаю, что все три файла будут находиться под единственным объектом request.FILES['file']. request.FILES['file'], вероятно, будет иметь либо первый файл, либо последний файл из этого списка.

Вам нужно однозначно называть входные элементы следующим образом:

<input type=file name="file1">
<input type=file name="file2">
<input type=file name="file3">

.. например.

EDIT: Justin answer лучше!