简体   繁体   English

如何使用Django-rest-framework上传多个文件

[英]How to upload multiple files with django-rest-framework

I am trying to upload a file using django-rest-frame, which works when uploading a single file. 我正在尝试使用django-rest-frame上传文件,该文件在上传单个文件时有效。 But when I upload multiple files, only the last file will be saved. 但是,当我上传多个文件时,只会保存最后一个文件。 How can I save all the files? 如何保存所有文件?

Python 3.6.2, Django 2.2.3 djangorestframework 3.10.1 Python 3.6.2,Django 2.2.3 djangorestframework 3.10.1

Below is my code 下面是我的代码

the vue: 观点:

<template>
    <input id="upload_file" type="file" multiple @change="v_upload_files"/>
</template>

<script>
  export default {
    data() {
      return {
        fileList: []
      };
    },
    methods: {
        v_upload_files(e) {
            let files = e.target.files;
            let formData = new FormData();
            for (let i = 0;i < files.length;i++) {
                formData.append(`file${i}`, files[i])
                // formData.append('file', files[i])
            }
            let url = '/upload/';

            axios.post(url, formData)
}
  }

}
</script>

models.py models.py

class File(models.Model):
    file = models.FileField(blank=False, null=False)

    def __str__(self):
        return self.file.name

serializers.py serializers.py

from rest_framework import serializers
from .models import File


class FileSerializer(serializers.ModelSerializer):

    files = serializers.ListField(child=serializers.FileField())

    class Meta:
        model = File
        fields = "__all__"

views.py views.py

from rest_framework.parsers import MultiPartParser
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from .serializers import FileSerializer

class FileUploadView(APIView):
    parser_class = (MultiPartParser,)

    def post(self, request, *args, **kwargs):

        altered_request_data = request.data.copy()
        in_memory_upload_files_list = [value for value in request.FILES.dict().values()]
        print(request.FILES.dict().values())
        altered_request_data.setlist('files', in_memory_upload_files_list)
        file_serializer = FileSerializer(data=altered_request_data)
        print(file_serializer)
        print(file_serializer.is_valid())
        if file_serializer.is_valid():
            file_serializer.save()
            print(file_serializer.data)
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

upload 2 files 上传2个文件

FileSerializer(data=<QueryDict: {'file{i}': [<InMemoryUploadedFile: 20190724_BRCA_report.xlsx (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)>, <InMemoryUploadedFile: 20190724_DMD_report.xlsx (application/vnd.openxmlformats-officedocument.spread
sheetml.sheet)>], 'files': [<InMemoryUploadedFile: 20190724_DMD_report.xlsx (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)>]}>):
    id = IntegerField(label='ID', read_only=True)
    files = ListField(child=FileField(), write_only=True)
    file = FileField(max_length=100)
Bad Request: /upload/

in Browser it return 在浏览器中返回

{"file":["No file was submitted."]}

You are using FileField in serializer which can save only one file although it received multiple files. 您正在序列化器中使用FileField,尽管它接收了多个文件,但只能保存一个文件。

Have you seen How to upload multiple files in django rest framework ? 您是否看到过如何在django rest框架中上传多个文件

You will either need to add more FileField for each file you want to save if they are of different types or have different semantics or you can use ListField with FileField as shown in above link 如果文件的类型不同或语义不同,则需要为每个要保存的文件添加更多FileField,也可以将ListField与FileField一起使用,如上面的链接所示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM