Python 确定base64上载的文件扩展名和mime类型
我有一个用于上传base64音频的Python 确定base64上载的文件扩展名和mime类型,python,django,audio,django-rest-framework,mime-types,Python,Django,Audio,Django Rest Framework,Mime Types,我有一个用于上传base64音频的FileField序列化程序,我注意到base64字符串不是以数据开头的:***。如何确定上载文件的Mime类型?我需要\u文件扩展名\u mimetype() 多亏了@Ralf的指点,我终于解决了这个问题 class AudioField(serializers.FileField): def to_internal_value(self, data): # Check to see if it's a base64 encoded f
FileField
序列化程序,我注意到base64字符串不是以数据开头的:***。如何确定上载文件的Mime类型?我需要\u文件扩展名\u mimetype()
多亏了@Ralf的指点,我终于解决了这个问题
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"\1", 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)
必填项:请参阅以获取一些建议。谢谢@Ralf,但这不适用于我的情况。我认为Mime类型是已知的,在我的例子中,Mime类型是未知的。我相信这些答案中提到的一些外部库,例如
python magic
,可以用来确定上传文件的文件类型和Mime类型。你需要Mime类型做什么?是否正在尝试确定文件是否包含有效的音频数据?重复的
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"\1", 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)