2014-06-25 34 views
11

może ktoś mi pomóc jak przesłać plik z metody POST w Django API spoczynkowym, na przykład kiedy uruchomićJak przesłać plik z Django API REST

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" 

Chcę przesłać 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) 

jestem nowicjuszem w Django REST API, czytałem dokumentacji http://www.django-rest-framework.org/api-guide/parsers.html#fileuploadparser, ale nadal nie undestand jak to zrobić

+0

Możliwy duplikat [Django Reszta ramowego Upload File] (http://stackoverflow.com/questions/20473572/django-rest-framework-file-upload) – DhiaTN

Odpowiedz

18

Przede wszystkim trzeba zdefiniować analizator składni w twoim widoku. Dzieje się tak dlatego, że interfejs API musi wiedzieć, które nagłówki należy szukać. Przeglądarki przesyłają pliki jako dane formularzy, więc musisz korzystać z MultiPartParser i FormParser razem. Możesz także użyć FileUploadParser, ale musisz upewnić się, że Twój klient wysyła prawidłowe nagłówki HTTP.

from rest_framework.parsers import MultiPartParser, FormParser 

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

Następnie w metodzie post, plik będzie obecny w plikach 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 
+0

proszę możesz mi wyjaśnić bardziej szczegółowo, – blaz1988

+0

dodałem klasy AssetAdd (APIView): parser_classes = (MultiPartParser, FormParser,) def post (samodzielne wniosek, format = None): my_file = request.FILES ['plik_fie ld_name '] print my_file – blaz1988

+1

kiedy próbowałem wykonać {"name": "Most San Francisco", "source": "assets/34/3492/3492AA/3492AA/source.jpg"}, ale dostałem błąd { " detail ":" Błąd analizy składowej wieloczęściowej - Nieprawidłowa granica w wieloczęściowej: brak " } – blaz1988

Powiązane problemy