【发布时间】:2019-07-31 11:17:24
【问题描述】:
我正在尝试使用 django-rest-frame 上传文件,该文件在上传单个文件时有效。但是当我上传多个文件时,只会保存最后一个文件。如何保存所有文件?
Python 3.6.2, Django 2.2.3 djangorestframework 3.10.1
下面是我的代码
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
序列化器.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)
上传 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/
在浏览器中返回
{"file":["No file was submitted."]}
【问题讨论】:
标签: python vue.js django-rest-framework