2016-07-08 4 views
1

Ich sende ein Bild, das Base64 codiert ist. Ich habe ein benutzerdefiniertes Serializerfeld für ImageField erstellt, um Base64-Codierung zu verarbeiten. Ich bin jetzt sicher, wie kann ich das Bild speichern, während eine Post-Anforderung zu tun, bevor sie durch den Serializer gehenDjango: Datei nicht gespeichert, nachdem ich zu Serializer.py gegangen bin

Unten ist mein serializers.py Codes

from rest_framework import serializers 
from .models import Photo 
import base64 
from django.core.files.base import ContentFile 
from rest_framework import serializers 
import pdb; 

class PhotoSerializer(serializers.ModelSerializer): 

    image = serializers.ImageField('from_native') 
    class Meta: 
     model = Photo 
     fields = ('photoname', 'image') 


    def from_native(self, data): 
     if isinstance(data, basestring) and data.startswith('data:image'): 
     # base64 encoded image - decode 
      format, imgstr = data.split(';base64,') 
      print(imgstr)# format ~= data:image/X, 
      ext = format.split('/')[-1] # guess file extension 
      data = ContentFile(base64.b64decode(imgstr), name='temp.' + ext) 

    return super(Base64ImageField, self).from_native(data) 

Antwort

0

Die entsprechende Serializer würde wie folgt aussehen:

from rest_framework import serializers 
from .models import Photo  

class Base64ImageField(serializers.ImageField): 

    def to_internal_value(self, data): 
     from django.core.files.base import ContentFile 
     import base64 
     import six 
     import uuid 

     if isinstance(data, six.string_types): 
      if 'data:' in data and ';base64,' in data: 
       header, data = data.split(';base64,') 

      try: 
       decoded_file = base64.b64decode(data) 
      except TypeError: 
       self.fail('invalid_image') 

      file_name = str(uuid.uuid4())[:12] # 12 characters are more than enough. 
      file_extension = self.get_file_extension(file_name, decoded_file) 
      complete_file_name = "%s.%s" % (file_name, file_extension,) 
      data = ContentFile(decoded_file, name=complete_file_name) 

     return super(Base64ImageField, self).to_internal_value(data) 

    def get_file_extension(self, file_name, decoded_file): 
     import imghdr 

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

     return extension 

class PhotoSerializer(serializers.ModelSerializer): 
    image = Base64ImageField(max_length=None, use_url=True) 

    class Meta: 
     model = Photo 
     fields = ('photoname', 'image')