7

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

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 Answers 2

6

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

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

Comments

3

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.

Comments

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.