确定base64上载的文件扩展名和mime类型

2024-04-26 09:36:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用于上传base64音频的FileField序列化程序,我注意到base64字符串不是以data:***开头的。如何确定上传文件的Mime类型?我需要文件扩展名mimetype()

class AudioField(serializers.FileField):
    def to_internal_value(self, data):
        if isinstance(data, basestring):
            data = re.sub(r"^data\:.+base64\,(.+)$", r"\1", 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)

Tags: 文件thetonameselfdatavaluefile
1条回答
网友
1楼 · 发布于 2024-04-26 09:36:43

我终于用^{}排序了,多亏了@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)

必需:^{}

相关问题 更多 >