2013-05-13 29 views
8

私はアプリから画像を受け取る必要があります。それをBase64でエンコードされたJSON配列に送るのが最も良い方法です。画像は非常に小さいので、余分なオーバーヘッドは気にしません。Django Rest FrameworkでBase64でエンコードされた画像を受け取ってImageFieldに保存します

私はモデルがあります:私は画像をデコードするためのコードを配置する必要があり

class ObsvSerializerNoDetect(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Observation 

class Observation(models.Model):  
    ... 
    sonogram_image = models.ImageField(upload_to=sonogram_dir) 

とそのシリアライザを?

+0

あなたはこれを理解しましたか? –

+0

はい、いいえ。イメージをテキストとして保存し、それをWebページにレンダリングするのはとても簡単です。 'img'タグでは' src = "data:image/png; base64、<ここのbase64文字列はここ>"です。私はそれが最良の方法であるかどうかはわかりませんが、うまく動作し、実装が簡単です。 – gozzilli

+0

@gozzilli base64ベースのソリューションのビュー/シリアライザ/モデルでsnippestを提供できますか? – andi

答えて

1

あり、あなたのユースケースに応じて、2つの最高の場所かもしれない:あなたがあなたのフィールドに上書きすることができますvalidate_Xtransform_Xメソッドを持っているあなたのシリアライザで

  1. validation docsを参照)への変換ここで両方向に

  2. この機能が必要な場合は、自分でcustom fieldを書きます。コンバージョンを両方向でどのように実行するかは、to_nativefrom_nativeで定義する必要があります。おそらく元のDRF ImageFieldを拡張して、画像データの検証をPILで保つようにしてください。

0

お試し django extra fieldsあなたのモデルでImageFieldを使用したことを前提として、シリアライザフィールドとしてBase64ImageFieldを使用してください。

4

ここでは、Djangoベースの(drfも)APIエンドでの投稿リクエストで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 django-extra-fields 

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

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

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

関連する問題