2013-02-27 18 views
6

पर एक डीकोडेड अस्थायी छवि को सहेजना मैं उन छवियों को सहेजने की कोशिश कर रहा हूं जो मुझे बेसगो एन्कोडेड टेक्स्ट को Django Imagefield में पास कर चुके हैं।Django Imagefield

लेकिन ऐसा लगता है कि यह सही ढंग से सहेज नहीं रहा है। डेटाबेस रिपोर्ट मेरे सभी छवियों "के रूप में" जब यह उन्हें उदाहरण के लिए एक फ़ाइल नाम के रूप में रिपोर्ट करना चाहिए जमा हो जाती है:

"template_images/template_folders/myImage.png" 

कोड है कि इस प्रकार है अपनी छवियों को बचाने के लिए कोशिश कर रहा है:

elif model_field.get_internal_type() == "ImageField" or model_field.get_internal_type() == "FileField": # Convert files from base64 back to a file. 
    if field_elt.text is not None: 
     setattr(instance, model_field.name, File(b64decode(field_elt.text))) 

उत्तर

24

पढ़ने के बाद this answer, मैं इस काम मिल गया:

from base64 import b64decode 
from django.core.files.base import ContentFile 

image_data = b64decode(b64_text) 
my_model_instance.cool_image_field = ContentFile(image_data, 'whatup.png') 
my_model_instance.save() 

इसलिए, मैं सुझाव है कि आप करने के लिए अपने कोड बदलने के लिए:

from django.core.files.base import ContentFile 

# Your other code... 

elif model_field.get_internal_type() == "ImageField" or model_field.get_internal_type() == "FileField": # Convert files from base64 back to a file. 
    if field_elt.text is not None: 
     image_data = b64decode(field_elt.text) 
     setattr(instance, model_field.name, ContentFile(image_data, 'myImage.png')) 

फिर, अपने ImageField संभालने upload_to तर्क template_images/template_folders/ करने के लिए सेट के साथ परिभाषित किया गया है, तो आप मुझे लगता है कि यह यह करने के लिए साफ और सबसे छोटा रास्ता है फ़ाइल YOUR_MEDIA_URL/template_images/template_folders/myImage.png

+0

समारोह कॉल कर सकते हैं हालांकि मैं डिकोड पर 'अनुचित गद्दी' मिलता है। कोई उपाय? – Mutant

+3

यूप, आप प्रारंभिक डेटा शामिल नहीं करना चाहते हैं: image/gif; base64, bit लेकिन फिर मुझे लगता है कि आप शायद जानते हैं कि अब तक, सिर्फ उन लोगों के लिए जो Google के माध्यम से यहां आए थे। –

+0

मुझे लगता है कि यह असफल हो सकता है क्योंकि आपको फ़ाइल का डेटा 'छवि/*; बेस 64,' भाग शामिल करने की आवश्यकता नहीं है। –

0

करने के लिए नीचे बचाने देखना चाहिए।

यहां यह है कि आप Django- आधारित (drf भी) एपीआई अंत में एक पोस्ट अनुरोध में बेस 64 एन्कोडेड छवि फ़ाइल को कैसे प्रबंधित कर सकते हैं जो इसे ImageField के रूप में सहेजता है।

माना कि आप मॉडल है इस प्रकार है:

Class MyImageModel(models.Model): 
     image = models.ImageField(upload_to = 'geo_entity_pic') 
     data=model.CharField() 

तो संगत Serializer इस प्रकार किया जाएगा के रूप में:

from drf_extra_fields.fields import Base64ImageField 

Class MyImageModelSerializer(serializers.ModelSerializers): 
     image=Base64ImageField() 
     class meta: 
     model=MyImageModel 
     fields= ('data','image') 
     def create(self, validated_data): 
     image=validated_data.pop('image') 
     data=validated_data.pop('data') 
     return MyImageModel.objects.create(data=data,image=image) 

इसी दृश्य के रूप में निम्नानुसार हो सकता है:

elif request.method == 'POST': 
    serializer = MyImageModelSerializer(data=request.data) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data, status=201) 
    return Response(serializer.errors, status=400) 

सीरिएलाइज़र में नोटिस मैंने मॉड्यूलमें प्रदान की गई बेस 64 इमेजफिल्ल्ड के कार्यान्वयन का उपयोग किया है

इस मॉड्यूल आदेश

pip install pip install django-extra-fields 

आयात ही और हो गया चलाने स्थापित करने के लिए!

अपनी छवि को किसी भी अन्य डेटा के साथ JSON ऑब्जेक्ट में बेस 64 एन्कोडेड स्ट्रिंग के रूप में भेजें (पोस्ट विधि के माध्यम से)।

0

एक और अच्छा दृष्टिकोण इस आधार पर तो जवाब: https://stackoverflow.com/a/28036805/6143656 यह कोशिश की और Django 1.10

मैं डीकोड बेस 64 फ़ाइल के लिए एक समारोह बना में परीक्षण किया गया।

def decode_base64_file(data): 

    def get_file_extension(file_name, decoded_file): 
     import imghdr 

     extension = imghdr.what(file_name, decoded_file) 
     extension = "jpg" if extension == "jpeg" else extension 

     return extension 

    from django.core.files.base import ContentFile 
    import base64 
    import six 
    import uuid 

    # Check if this is a base64 string 
    if isinstance(data, six.string_types): 
     # Check if the base64 string is in the "data:" format 
     if 'data:' in data and ';base64,' in data: 
      # Break out the header from the base64 content 
      header, data = data.split(';base64,') 

     # Try to decode the file. Return validation error if it fails. 
     try: 
      decoded_file = base64.b64decode(data) 
     except TypeError: 
      TypeError('invalid_image') 

     # Generate file name: 
     file_name = str(uuid.uuid4())[:12] # 12 characters are more than enough. 
     # Get the file name extension: 
     file_extension = get_file_extension(file_name, decoded_file) 

     complete_file_name = "%s.%s" % (file_name, file_extension,) 

     return ContentFile(decoded_file, name=complete_file_name) 

तो फिर तुम, मैं एक ही दृष्टिकोण का पालन करने की कोशिश की

import decode_base64_file 

p = Post(content='My Picture', image=decode_based64_file(your_base64_file)) 
p.save() 
संबंधित मुद्दे