Django Rest Framework File Upload Django Rest Framework File Upload django django

Django Rest Framework File Upload


I'm using the same stack and was also looking for an example of file upload, but my case is simpler since I use the ModelViewSet instead of APIView. The key turned out to be the pre_save hook. I ended up using it together with the angular-file-upload module like so:

# Djangoclass ExperimentViewSet(ModelViewSet):    queryset = Experiment.objects.all()    serializer_class = ExperimentSerializer    def pre_save(self, obj):        obj.samplesheet = self.request.FILES.get('file')class Experiment(Model):    notes = TextField(blank=True)    samplesheet = FileField(blank=True, default='')    user = ForeignKey(User, related_name='experiments')class ExperimentSerializer(ModelSerializer):    class Meta:        model = Experiment        fields = ('id', 'notes', 'samplesheet', 'user')// AngularJScontroller('UploadExperimentCtrl', function($scope, $upload) {    $scope.submit = function(files, exp) {        $upload.upload({            url: '/api/experiments/' + exp.id + '/',            method: 'PUT',            data: {user: exp.user.id},            file: files[0]        });    };});


Use the FileUploadParser, it's all in the request.Use a put method instead, you'll find an example in the docs :)

class FileUploadView(views.APIView):    parser_classes = (FileUploadParser,)    def put(self, request, filename, format=None):        file_obj = request.FILES['file']        # do some stuff with uploaded file        return Response(status=204)


Finally I am able to upload image using Django. Here is my working code

views.py

class FileUploadView(APIView):    parser_classes = (FileUploadParser, )    def post(self, request, format='jpg'):        up_file = request.FILES['file']        destination = open('/Users/Username/' + up_file.name, 'wb+')        for chunk in up_file.chunks():            destination.write(chunk)        destination.close()  # File should be closed only after all chuns are added        # ...        # do some stuff with uploaded file        # ...        return Response(up_file.name, status.HTTP_201_CREATED)

urls.py

urlpatterns = patterns('', url(r'^imageUpload', views.FileUploadView.as_view())

curl request to upload

curl -X POST -S -H -u "admin:password" -F "file=@img.jpg;type=image/jpg" 127.0.0.1:8000/resourceurl/imageUpload