1

I am trying to upload a file using django-rest-frame, which works when uploading a single file. 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

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

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

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

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

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

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."]}

1 Answer 1

0

You are using FileField in serializer which can save only one file although it received multiple files.

Have you seen How to upload multiple files in django rest framework ?

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

Sign up to request clarification or add additional context in comments.

1 Comment

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.