我无法上传具有相同输入名称的多个文件:
<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']对象下。我如何处理从这里上传的每个文件?
答案 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)