【问题标题】:Determine base64 uploaded file extension and mime type确定 base64 上传的文件扩展名和 mime 类型
【发布时间】:2018-04-18 22:46:48
【问题描述】:

我有一个 FileField 用于上传 base64 音频的序列化器,我注意到 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"\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)

【问题讨论】:

  • 请参阅this post 获取一些建议。
  • 感谢@Ralf,但这不适用于我的情况。我已经知道 Mime 类型,在我的情况下,我的 Mime 类型是未知的
  • 我相信这些答案中提到的一些外部库,例如python-magic,可用于确定您上传文件的文件类型和mime-type。
  • 你需要 MIME 类型做什么?您是否尝试确定文件是否包含有效的音频数据?

标签: python django audio django-rest-framework mime-types


【解决方案1】:

感谢@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"\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)

必填:pip install python-magic

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2013-11-11
    • 2014-10-30
    • 2015-09-23
    • 2010-10-03
    • 2012-11-18
    相关资源
    最近更新 更多