Django Rest Framework and File Upload

2019-04-28 15:26发布

I'm trying to build file upload with DRF and jQuery. I googled and found this sample. I have some similar code on beckand:

class Attachment(BaseModel):
      file = models.FileField(upload_to=get_photo_path)


class AttachmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Attachment
        fields = ('id', 'file')

class AttachmentViewSet(viewsets.ModelViewSet):
    parser_classes = (FileUploadParser, )
    serializer_class = serializers.AttachmentSerializer
    queryset = models.Attachment.objects.all()

    def pre_save(self, obj):
        obj.file = self.request.FILES.get('file')

And tried to translate Angular sample to jQuery

  var fd = new FormData()
  fd.append('file', file) // file from file-field
  var reader = new FileReader()
  $.ajax({
      url: 'http://localhost:8001/files/',
      data: fd,
      processData: false,
      contentType: false,
      type: 'POST'
  }).done(...

For some reasons I have an error on backend when try to upload a file:

detail: "FileUpload parse error - none of upload handlers can handle the stream"

2条回答
一夜七次
2楼-- · 2019-04-28 16:09

Actually the problem is a type of parser. I should use (FormParser, MultiPartParser, ) instead of (FileUploadParser, )

查看更多
在下西门庆
3楼-- · 2019-04-28 16:13

Default Django upload handlers are:

["django.core.files.uploadhandler.MemoryFileUploadHandler", "django.core.files.uploadhandler.TemporaryFileUploadHandler"]

and there is no FILE_UPLOAD_HANDLERS parameter in the app settings file by default.

In my case I've excluded MemoryFileUploadHandler and set

FILE_UPLOAD_HANDLERS = ["django.core.files.uploadhandler.TemporaryFileUploadHandler", ]

in app settings file and it solved the problem.

查看更多
登录 后发表回答