在django中使用相同的输入名称上载多个文件

时间:2009-05-12 06:01:02

标签: django file upload file-upload

我无法上传具有相同输入名称的多个文件:

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

所以这三个文件都在单个request.FILES ['file']对象下。我如何处理从这里上传的每个文件?

4 个答案:

答案 0 :(得分:57)

for f in request.FILES.getlist('file'):
    # do something with the file f...
编辑:我知道这是一个陈旧的答案,但我刚刚遇到它,并编辑了答案,实际上是正确的。之前建议您可以直接在request.FILES['file']上进行迭代。要访问MultiValueDict中的所有项目,请使用.getlist('file')。仅使用['file']将仅返回它为该键找到的最后一个数据值。

答案 1 :(得分:10)

鉴于您的网址指向 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()

答案 2 :(得分:1)

我不认为所有三个文件都在单个request.FILES['file']对象下。 request.FILES['file']可能包含该列表中的第一个文件或最后一个文件。

您需要对输入元素进行唯一命名,如下所示:

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

..例如。

编辑:Justin's answer更好!

答案 3 :(得分:0)

此代码为示例

    for f in request.FILES.getlist('myfile[]'):
        if request.method == 'POST' and f:
            myfile = f
            filesystem = FileSystemStorage()
            filename = filesystem.save(myfile.name, myfile)