2014-06-25 8 views
11

कोई मेरी मदद कर सकते जब मैंकैसे Django REST API फ़ाइल अपलोड करने के

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" 

लांच Django बाकी एपीआई में पोस्ट विधि के साथ फाइल को अपलोड करने के लिए कैसे, उदाहरण के लिए मैं 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) 

मैं Django REST API में नौसिखिया हूँ, मैं प्रलेखन http://www.django-rest-framework.org/api-guide/parsers.html#fileuploadparser पढ़ा है, लेकिन अभी भी इसे कैसे करना

+0

संभावित डुप्लिकेट http://stackoverflow.com/questions:

from rest_framework.parsers import MultiPartParser, FormParser class AssetAdd(APIView): parser_classes = (MultiPartParser, FormParser,) 

फिर, पोस्ट विधि में, आपकी फ़ाइल फ़ाइलें QueryDict में मौजूद रहेंगे/20473572/Django-आराम-ढांचे फाइल अपलोड करें) – DhiaTN

उत्तर

18

सबसे पहले आप एक परिभाषित करने की जरूरत नहीं है समझने के आपके विचार में पार्सर। ऐसा इसलिए है क्योंकि एपीआई को यह जानने की जरूरत है कि कौन से शीर्षकों की तलाश है। ब्राउज़र फ़ाइलों को फॉर्म-डेटा के रूप में स्थानांतरित करते हैं, इसलिए आपको मल्टीपार्ट पार्सर और फॉर्मपार्सर को एक साथ उपयोग करने की आवश्यकता है। आप FileUploadParser का भी उपयोग कर सकते हैं लेकिन आपको यह सुनिश्चित करना होगा कि आपका क्लाइंट सही HTTP शीर्षलेख भेज रहा हो।

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 
[Django बाकी फ्रेमवर्क फाइल अपलोड] (की
+0

कृपया आप, अधिक जानकारी में मुझे समझा सकता – blaz1988

+0

मैं कक्षा AssetAdd (APIView) कहा: parser_classes = (MultiPartParser, FormParser,) डीईएफ़ पोस्ट (स्वयं, अनुरोध, प्रारूप = कोई नहीं): my_file = request.FILES ['file_fie ld_name '] प्रिंट my_file – blaz1988

+1

जब मैंने {"नाम": "सैन फ्रांसिस्को ब्रिज", "स्रोत" निष्पादित करने का प्रयास किया: "संपत्ति/34/3492/3492AA/3492AA/source.jpg"}, लेकिन त्रुटि प्राप्त करें { " विस्तार ":" मल्टीपार्ट फॉर्म पार्स त्रुटि - मल्टीपार्ट में अमान्य सीमा: कोई भी नहीं " } – blaz1988

संबंधित मुद्दे