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实现多文件上传

4 回复

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_ROOTMEDIA_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 字段

回到顶部