Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How To Upload File with Django Rest APi

can someone help me how to upload file with POST method in django rest api, for example when I launch

curl -X POST 127.0.0.1:8000/api/v1/assets/ -d '{"name" = "my image   ","source"="/root/images/my_image2.jpg"}' -H "Content-Type: application/json"

I want to upload my_image2.jpg

serializers.py:

from django.forms import widgets
from rest_framework import serializers
from .models import Asset

class AssetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Asset

views.py:

from .serializers import AssetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from rest_framework import status
from rest_framework.decorators import api_view


class AssetAdd(APIView):


    def post(self, request, format=None):
        serializer = AssetSerializer(data=request.DATA)
        print serializer.data

        if serializer.is_valid():

            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

models.py

class Asset(models.Model):

    key = models.CharField(max_length=8, unique=True, editable=False)
    name = models.CharField(_('name'), max_length=200)
    source = models.FileField(_('file'), upload_to=upload_to, storage=default_storage)

    ext = models.CharField(max_length=15, editable=False)
    type = models.PositiveIntegerField(choices=ASSET_TYPE, max_length=15, editable=False)
    size = models.PositiveIntegerField(max_length=32, default=0, editable=False)

    _file_meta = models.TextField(editable=False, null=True, blank=True)

    public = models.BooleanField(default=False)
    position = models.PositiveIntegerField(default=1)

    object_id = models.PositiveIntegerField(default=1)
    content_type = models.ForeignKey(ContentType, blank=True, null=True)
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now_add=True, auto_now=True)

I'm newbie in Django REST API , I read documentation http://www.django-rest-framework.org/api-guide/parsers.html#fileuploadparser , but still don't undestand how to do it

like image 887
blaz1988 Avatar asked Jun 25 '14 12:06

blaz1988


People also ask

How do I handle file upload in Django REST Framework?

You just need to put the field in your ModelSerializer and set content-type=multipart/form-data; in your client. BUT as you know you can not send files in json format. (when content-type is set to application/json in your client). Unless you use Base64 format.


1 Answers

First of all you need to define a parser in your view. This is because the API needs to know which headers to look for. Browsers transfer files as form-data, so you need to use the MultiPartParser and FormParser together. You can also use the FileUploadParser but you need to make sure your client is sending the correct HTTP headers.

from rest_framework.parsers import MultiPartParser, FormParser

class AssetAdd(APIView):
    parser_classes = (MultiPartParser, FormParser,)

Then, in the post method, your file will be present in the FILES QueryDict:

def post(self, request, format=None):
    my_file = request.FILES['file_field_name']
    filename = '/tmp/myfile'
    with open(filename, 'wb+') as temp_file:
        for chunk in my_file.chunks():
            temp_file.write(chunk)

    my_saved_file = open(filename) #there you go
like image 66
fixmycode Avatar answered Sep 21 '22 08:09

fixmycode