2016-07-08 19 views
1

base64でエンコードされた画像を送信しています。私はBase64エンコーディングを処理するImageField用のカスタムシリアライザフィールドを作成しました。私は今、シリアライザを通過する前にポストの要求をしている間、私は、画像を保存する方法を確認していDjango:Serializer.pyに行った後にファイルが保存されない

以下

は私のserializers.pyコードです

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) 

答えて

0

次のように対応するシリアライザは次のようになります。

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') 
関連する問題