2013-02-27 31 views
6

Base64でエンコードされたテキストとして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')) 

その後、ImageFieldtemplate_images/template_folders/に設定upload_to引数で定義されているあなた、あなたは私はこれはこれを行うにはクリーンかつ最短の道だと思い、ファイルがYOUR_MEDIA_URL/template_images/template_folders/myImage.png

+0

関数を呼び出すことができます。なにか提案を? – Mutant

+3

あなたは最初のデータを含めたくないです:image/gif; base64、bitしかし、私はあなたのことを知っていると思います。 –

+0

ファイルの 'data:image/*; base64 'をインクルードする必要がないので、これが失敗するかもしれないと思います。 –

0

まで保存見るべきであると仮定。

これは、Djangoベースの(drfも)APIエンドでのPost要求で、Base64でエンコードされた画像ファイルを処理してImageFieldとして保存する方法です。

レッツは、次のようにモデルを持っていると言う:

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

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

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) 

通知シリアライザでは、モジュールに提供されたBase64ImageFieldの実装を使用しましたこのモジュールは

pip install pip install django-extra-fields 

のコマンドを実行してインストールするには

は同じと完了をインポートします!

JSONオブジェクト内のBase64エンコードされた文字列として画像を送信します(他のデータと同様に)。

0

SO答えるこれに基づいて別の良い方法:https://stackoverflow.com/a/28036805/6143656はそれを試してみましたが、ジャンゴ1.10

私は復号化されたbase64でファイルの機能を作って試験します。

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