判断base64上传的文件扩展名和mime类型
Determine base64 uploaded file extension and mime type
我有一个用于上传 base64 音频的 FileField
序列化器,我注意到 Base64 字符串不是以 data:**** 开头。如何确定上传文件的 Mime 类型? i_need_the_file_extension_mimetype()
class AudioField(serializers.FileField):
def to_internal_value(self, data):
if isinstance(data, basestring):
data = re.sub(r"^data\:.+base64\,(.+)$", r"", data)
# Try to base64 decode the data url.
try:
decoded = base64.b64decode(data)
except TypeError:
raise serializers.ValidationError(_('Not a valid file'))
file_name, file_ext, mime_type = self.i_need_the_file_extension_mimetype(decoded)
data = ContentFile(decoded, name=file_name)
return super(AudioField, self).to_internal_value(data)
感谢@Ralf 的指点
,我终于用 python-magic
解决了这个问题
class AudioField(serializers.FileField):
def to_internal_value(self, data):
# Check to see if it's a base64 encoded file.
if isinstance(data, basestring):
# Strip out the data header if it exists.
data = re.sub(r"^data\:.+base64\,(.+)$", r"", data)
try:
decoded = base64.b64decode(data)
mime_type = magic.from_buffer(decoded, mime=True)
file_ext = mimetypes.guess_extension(mime_type)
except TypeError:
raise serializers.ValidationError(_('Not a valid file'))
file_name = "{}{}".format(uuid.uuid4(), file_ext)
# Check if it's a valid file extension.
if file_ext[1:] not in settings.VOICE_VALID_FILE_EXTENSIONS:
raise serializers.ValidationError(_('Invalid file type.'))
# Update the data dict with new values.
data = ContentFile(decoded, name=file_name)
return super(AudioField, self).to_internal_value(data)
我有一个用于上传 base64 音频的 FileField
序列化器,我注意到 Base64 字符串不是以 data:**** 开头。如何确定上传文件的 Mime 类型? i_need_the_file_extension_mimetype()
class AudioField(serializers.FileField):
def to_internal_value(self, data):
if isinstance(data, basestring):
data = re.sub(r"^data\:.+base64\,(.+)$", r"", data)
# Try to base64 decode the data url.
try:
decoded = base64.b64decode(data)
except TypeError:
raise serializers.ValidationError(_('Not a valid file'))
file_name, file_ext, mime_type = self.i_need_the_file_extension_mimetype(decoded)
data = ContentFile(decoded, name=file_name)
return super(AudioField, self).to_internal_value(data)
感谢@Ralf 的指点
,我终于用python-magic
解决了这个问题
class AudioField(serializers.FileField):
def to_internal_value(self, data):
# Check to see if it's a base64 encoded file.
if isinstance(data, basestring):
# Strip out the data header if it exists.
data = re.sub(r"^data\:.+base64\,(.+)$", r"", data)
try:
decoded = base64.b64decode(data)
mime_type = magic.from_buffer(decoded, mime=True)
file_ext = mimetypes.guess_extension(mime_type)
except TypeError:
raise serializers.ValidationError(_('Not a valid file'))
file_name = "{}{}".format(uuid.uuid4(), file_ext)
# Check if it's a valid file extension.
if file_ext[1:] not in settings.VOICE_VALID_FILE_EXTENSIONS:
raise serializers.ValidationError(_('Invalid file type.'))
# Update the data dict with new values.
data = ContentFile(decoded, name=file_name)
return super(AudioField, self).to_internal_value(data)