Загрузка нескольких файлов с использованием того же имени ввода в 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 лучше!