2012-01-11 19 views
6

एक ऐप से पोस्टिंग (आईओएस एंड्रॉइड आदि ..) एक वेब फॉर्म नहीं है।django imageField का उपयोग कर छवि को कैसे सहेजना है?

class someImage(models.Model): 
    image = models.ImageField(upload_to= settings.SHARE_IMAGE_UPLOAD_PATH) 

@csrf_exempt 
def saveImage(request): 

दृश्य कैसे लिखें? यह एक पोस्ट अनुरोध में एक छवि प्राप्त करता है। हर बात मैं खोजने के प्रपत्र से संबंधित (सर्वर नौसिखिया) है

+0

पर एक नज़र डालें [Django-photologue] (http://code.google.com/p/django-photologue/), जो कुछ आप करना चाहते हैं वह पहले ही हो चुका है :) – juliomalegria

+0

धन्यवाद, मुझे इन सभी सुविधाओं की आवश्यकता नहीं है, मैं सबसे बुनियादी की तलाश में हूं ImageField का उपयोग :) –

उत्तर

15

सिर्फ इसलिए कि आप एक वास्तविक HTML प्रपत्र उपयोग नहीं कर रहे डेटा मतलब यह नहीं है कि आप एक ModelForm उपयोग नहीं कर सकते अनुरोध पर कार्रवाई करने प्रस्तुत करने के लिए:

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed 
from django.utils import simplejson 

def upload_view(request): 
    if request.method == 'POST': 
     form = UploadForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      result = {'success': True} 
      return HttpResponse(simplejson.dumps(result), mimetype='application/json') 
     else: 
      return HttpResponseBadRequest() 
    else: 
     return HttpResponseNotAllowed(['POST']) 
+0

मुझे परिणाम सफलता मिलती है, लेकिन मुझे मोडल में सेट किए गए पथ पर सहेजा जा रहा फ़ाइल (यह स्थानीय पथ: उपयोगकर्ता/योगेहेली/डाउनलोड /) नहीं है जब मैं Image.save का उपयोग कर डिस्क पर छवि को सहेजने का प्रयास करता हूं ('पथ', 'जेपीईजी') मैं फ़ाइल देखता हूं, लेकिन मुझे शुरुआत में पथ में '/' जोड़ना होगा। कोई विचार? धन्यवाद –

+0

ओह, छवियों को बस ठीक से सहेजा गया था, बस प्रोजेक्ट फ़ोल्डर के संबंध में और मेरे कंप्यूटर के रूट फ़ोल्डर में, बहुत बहुत धन्यवाद! –

+0

और http://stackoverflow.com/a/5567063/955619 पर बताए गए फॉर्म टेम्पलेट में 'enctype =" multipart/form-data "' शामिल करना न भूलें – Caumons

3

संपादित करें: जवाब ऊपर चुने का उपयोग करें - नीचे कोड प्रश्न के लिए काम करता है, लेकिन यह अनुशंसित नहीं है।

छवि फ़ाइल अपलोड किए जा रहे में पाया जा सकता:

request.FILES['image'] # assuming input name is called 'image' 

यह आप एक छवि वस्तु वापस नहीं करता है, बल्कि एक UploadedFile वस्तु। आप दस्तावेज़ों के इस हिस्से को पढ़ सकते हैं (मुझे लगता है कि आप Django 1.3.x का उपयोग कर रहे हैं): https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

इसमें अपलोड किए गए फ़ाइल ऑब्जेक्ट में उपलब्ध फ़ील्ड और विधियों को शामिल किया गया है, और फ़ाइल अपलोड मैन्युअल रूप से प्रबंधित करने का एक आम तरीका भी है। आप छवि फ़ाइल को फ़ाइल ऑब्जेक्ट में लिखने के लिए उसी विधि का उपयोग कर सकते हैं और फिर इसे अपनी छवि फ़ील्ड में सहेज सकते हैं।

निम्नलिखित कोड काम करना चाहिए, लेकिन यह सुरक्षित कोड नहीं है। मुझे लगता है कि आप * निक्स मशीन का उपयोग कर रहे हैं, यदि नहीं, गंतव्य फ़ाइल को कहीं और सहेजें।

@csrf_exempt 
def saveImage(request): 
    # warning, code might not be safe 
    up_file = request.FILES['image'] 
    destination = open('/tmp/' + up_file.name , 'wb+') 
    for chunk in up_file.chunks(): 
     destination.write(chunk) 
    destination.close() 
    img = someImage() 
    img.image.save(up_file.name, File(open('/tmp/' + up_file.name, 'r'))) 
    img.save() 
    # return any response you want after this 

अन्य बातों पर ध्यान देना: सुनिश्चित करें कि आप के रूप में कार्य करने के लिए निम्न विशेषता है:

<form enctype="multipart/form-data" ... > 

मैं इस प्रयोग को याद नहीं है सामान्य जा रहा है, लेकिन वास्तव में, प्रपत्र सिफारिश की है।

+0

धन्यवाद, मुझे पता है कि। अब क्या? प्रवाह क्या है? क्या मैं इसे भौतिक फ़ाइल में सहेजता हूं और बस छवि फ़ील्ड को पथ पास करता हूं? किसी भी स्निपेट्स को यह एक बहुत ही आम काम होना चाहिए, धन्यवाद! –

+0

मैंने नमूना कोड के साथ उत्तर अद्यतन किया है। यदि आप मॉडल फॉर्म का उपयोग करते हैं तो कोड बहुत आसान और सुरक्षित होगा। –

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