2013-05-13 79 views
8

我需要從應用程序接收圖像,而我能想到的最佳方式是將其發送到Base64中編碼的JSON數組中。圖像非常小,所以我不在乎額外的開銷。在Django Rest Framework中接收Base64編碼的圖像並保存到ImageField中

我有一個模型:

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

而其串行器:

class ObsvSerializerNoDetect(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Observation 

我應該在哪裏把代碼對圖像進行解碼?

+0

你有沒有想過這個? – 2013-09-03 05:28:05

+0

是的,沒有。我將圖像作爲文本存儲,然後將其呈現在網頁上非常簡單,在'img'標記中放入'src =「data:image/png; base64,<您的base64字符串>。我不確定這是最好的方式,但它工作正常並且易於實施。 – gozzilli 2013-09-03 15:41:29

+0

@gozzilli您能否提供基於base64解決方案的視圖/序列化器/模型? – andi 2014-07-22 22:41:21

回答

1

可能有兩個最好的位置,這取決於你的用例:

  1. 在你的串行

    你有validate_Xtransform_X方法,您可以覆蓋你的領域(見validation docs)和轉換在這裏兩個方向。

  2. 如果您需要更頻繁的功能,請自己編寫custom field。您只需定義to_nativefrom_native兩種方向的轉化運行方式。也許延長原始DRF ImageField以保持PIL的圖像數據驗證。

4

下面介紹如何在基於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 django-extra-fields 

導入相同,完成!

將您的圖像作爲JSON對象中的Base64編碼字符串以及您擁有的任何其他數據發送(通過post方法)。

相關問題