загрузка нескольких файлов с использованием одного и того же имени в django - PullRequest
19 голосов
/ 12 мая 2009

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

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

на стороне Джанго

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)>
]}>

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

Ответы [ 3 ]

57 голосов
/ 13 мая 2009
for f in request.FILES.getlist('file'):
    # do something with the file f...

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

10 голосов
/ 16 октября 2009

Учитывая, что ваш 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()
1 голос
/ 12 мая 2009

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

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

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

.. например.

РЕДАКТИРОВАТЬ: Ответ Джастина лучше!

...