Python Django:转到Serializer.py后未保存文件
我正在发送一个base64编码的图像。我已经为ImageField创建了一个自定义序列化器字段来处理base64编码。我现在可以确定在执行序列化程序之前,在执行post请求时如何保存图像 下面是我的serializers.py代码Python Django:转到Serializer.py后未保存文件,python,django,serialization,Python,Django,Serialization,我正在发送一个base64编码的图像。我已经为ImageField创建了一个自定义序列化器字段来处理base64编码。我现在可以确定在执行序列化程序之前,在执行post请求时如何保存图像 下面是我的serializers.py代码 from rest_framework import serializers from .models import Photo import base64 from django.core.files.base import ContentFile from res
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)
相应的序列化程序如下所示:
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')
相应的序列化程序如下所示:
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')