在 Django Rest Framework 中接收 Base64 编码的图像并保存到 ImageField
Posted
技术标签:
【中文标题】在 Django Rest Framework 中接收 Base64 编码的图像并保存到 ImageField【英文标题】:Receive a Base64 encoded image in Django Rest Framework and save into ImageField 【发布时间】:2013-05-07 13:18:07 【问题描述】:我需要从应用程序接收图像,我能想到的最好方法是将其发送到以 Base64 编码的 JSON 数组中。图像非常小,所以我不在乎额外的开销。
我有一个模型:
class Observation(models.Model):
...
sonogram_image = models.ImageField(upload_to=sonogram_dir)
及其序列化器:
class ObsvSerializerNoDetect(serializers.HyperlinkedModelSerializer):
class Meta:
model = Observation
我应该把解码图像的代码放在哪里?
【问题讨论】:
你有没有想过这个问题? 是和不是。我将图像存储为文本,然后将其渲染到网页非常容易,在您放置src="data:image/png;base64,<your base64 string here>"
的 img
标记中。我不确定这是不是最好的方法,但它工作正常且易于实施。
@gozzilli 您能否提供基于 base64 的解决方案的视图/序列化器/模型的片段?
我的回答可能对你有所帮助:***.com/questions/25027093/…
【参考方案1】:
这是在基于 Django(也称为 drf)的 API 端的发布请求中处理 Base64 编码图像文件的方法,该 API 将其保存为 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() # From DRF Extra Fields
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)
对应的View可以如下:
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)
注意在序列化器中我使用了模块django-extra-field中提供的Base64ImageField实现
要安装此模块,请运行命令
pip install django-extra-fields
导入相同并完成!
将您的图像作为 JSON 对象中的 Base64 编码字符串连同您拥有的任何其他数据一起发送(通过 post 方法)。
【讨论】:
【参考方案2】:试试django extra fields
。使用Base64ImageField
作为序列化器字段当然假设您在模型中使用了ImageField
。
【讨论】:
【参考方案3】:可能有两个最佳位置,具体取决于您的用例:
在您的序列化程序中,您可以为您的字段覆盖validate_X
和transform_X
方法(请参阅validation docs)并在此处进行双向转换。
如果您更频繁地需要该功能,请编写自己的 custom field。您只需在to_native
和from_native
中定义转换在两个方向上的运行方式。也许扩展原始 DRF ImageField
以保持使用 PIL 进行图像数据验证。
更新 DRF3:
transform_X
方法替换为to_representation()
。请参阅removal-of-transform_field_name 和Overriding serialization and deserialization behavior
。
还请查看此 DRF Base64ImageFieldMixin 示例。
【讨论】:
以上是关于在 Django Rest Framework 中接收 Base64 编码的图像并保存到 ImageField的主要内容,如果未能解决你的问题,请参考以下文章