Python中如何使用Django实现多文件上传
实现了单文件上传,不会多文件上传,目前前端用一个 form 表单,进行多文件选择,但不太清楚,前端怎么获取选择的多 文件,并且改送给后端,请教一下各位,应该怎么实现多文件上传?
前端:
<div class="input-group">
<form action="/manage/upload/" method="post" enctype="application/x-www-form-urlencoded" ><input id="file_upload" name="fileupload" accept="image/png, image/jpeg" multiple="multiple" type="file" value="" /><input id="file_upload" type="button" value="上传" onclick="FileUpload()"/>
</form>
</div>
//上传图像
function FileUpload() {
$("#prompt").hide();
if ($("#file_upload").val() === ""){
$("#imgprompt").show();
return false;
}
$("#imgprompt").hide();
$("#loading").show();
var form_data = new FormData();
var file_info =$('#file_upload')[0].files[0];
form_data.append('file',file_info);
console.log(form_data);
$.ajax({
url:'/manage/upload/',
type:'POST',
data: form_data,
processData: false,
contentType: false,
success: function(callback) {
console.log('ok');
$("#loading").hide();
$("#prompt").show();
}
});
}
后端:
def upload(request):
if request.method == 'POST':
file_obj = request.FILES.get('file')
print("file_obj.name", file_obj, file_obj.name)
f = open(os.path.join('upload', file_obj.name), 'wb')
for chunk in file_obj.chunks():
f.write(chunk)
f.close()
return HttpResponse('OK')
Python中如何使用Django实现多文件上传
request.FILES.getlist
在Django里搞多文件上传,其实挺简单的。核心就是用request.FILES.getlist()来获取文件列表,然后遍历处理。
下面给你个完整的例子,包含模型、表单、视图和模板。
1. 先建个模型来存文件信息
# models.py
from django.db import models
class UploadedFile(models.Model):
file = models.FileField(upload_to='uploads/')
uploaded_at = models.DateTimeField(auto_now_add=True)
2. 做个表单来处理上传
# forms.py
from django import forms
class MultipleFileUploadForm(forms.Form):
files = forms.FileField(
widget=forms.ClearableFileInput(attrs={'multiple': True}),
label='选择文件'
)
3. 写个视图来处理上传逻辑
# views.py
from django.shortcuts import render, redirect
from .forms import MultipleFileUploadForm
from .models import UploadedFile
import os
def upload_files(request):
if request.method == 'POST':
form = MultipleFileUploadForm(request.POST, request.FILES)
if form.is_valid():
files = request.FILES.getlist('files')
for file in files:
# 这里可以加些文件验证,比如大小、类型
if file.size > 10 * 1024 * 1024: # 限制10MB
continue
# 保存到数据库
uploaded_file = UploadedFile(file=file)
uploaded_file.save()
return redirect('success_url') # 上传成功后跳转
else:
form = MultipleFileUploadForm()
return render(request, 'upload.html', {'form': form})
4. 模板文件这样写
<!-- upload.html -->
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">上传</button>
</form>
5. 别忘了配置URL
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('upload/', views.upload_files, name='upload'),
]
几个关键点:
- 表单一定要加
enctype="multipart/form-data",不然传不了文件 request.FILES.getlist('files')拿到的就是文件列表- 遍历处理每个文件,想怎么存就怎么存
- 记得在settings里配置
MEDIA_ROOT和MEDIA_URL来处理文件存储
如果想更高级的功能,比如进度条、拖拽上传,可以配合JavaScript来做,但核心的后端逻辑就是这么回事。
总结:用getlist()拿文件列表,遍历处理就完事了。
我是用 restframework, 大致上是这样实现的, 这不是上传图片, 希望对你有帮助
from rest_framework.parsers import FormParser, MultiPartParser
from rest_framework.response import Response
class MultipleFileSerializer(serializers.Serializer):
files = serializers.ListField(child=serializers.FileField())
class UserViewset(ModelViewSet):
serializer_class = UserSerializer
pagination_class = UserPagination
parser_classes = (FormParser, MultiPartParser)
def create(self, request, *args, **kwargs):
print(dir(request))
print(request.FILES)
text = request.FILES[‘file1’].read() + request.FILES[‘file2’].read()
return Response(text)
这有什么问题,多个文件就有多个 form 字段

