使用django格式检查文件类型:'application / octet

我使用django验证器和python-magic来检查上传文件的MIME类型,并只接受pdf,zip和rar文件。

接受的MIME类型是:'application / pdf','application / zip','multipart / x-zip','application / x-zip-compressed','application / x-compressed','application / rar', 'application / x-rar''application / x-rar-compressed','compressed / rar',

问题是,有时pdf文件似乎有'application / octet-stream'作为MIME类型。 'application / octet-stream'表示通用的二进制文件,所以我不能简单地将该MIME类型添加到接受文件列表中,因为在这种情况下,其他文件(如EXCEL文件)也会被接受,而且我不想那要发生。

在这种情况下我该怎么办?

提前致谢。


您不应该依赖提供的MIME类型,而应该依赖于文件本身的前几个字节中发现的MIME类型。

这将有助于消除通用MIME类型问题。

这种方法的问题在于它通常依赖于某些第三方工具(例如Linux系统中常见的file命令很棒;将它与-b --mime -一起使用)并将文件的前几个字节传递给它给你的MIME类型)。

您拥有的另一个选项是接受该文件,并尝试通过打开一个库来验证它。

因此,如果pypdf无法打开该文件,并且内置zip模块无法打开该文件,并且rarfile无法打开该文件 - 这很可能是您不想接受的内容。


通过在文件头中读取其元数据来窥探文件内容是最愚蠢的方式。

在大多数文件中,这个文件头通常存储在文件的开头,尽管在某些文件头中可能位于其他位置。

python-magic可以帮助你做到这一点,但诀窍是在试图猜测它的MIME类型之前,总是重置指针在文件的开头,否则你有时会得到appliation / octet-stream MIME类型,如果读者的指针已经超过文件头位置到其他只包含任意字节流的位置。

例如,如果你有一个django验证器函数试图验证MIME类型的上传文件:

import magic
from django.core.exceptions import ValidationError

def validate_file_type(upload):
    allowed_filetypes = [
        'application/pdf', 'image/jpeg', 'image/jpg', 'image/png',
        'application/msword']
    upload.seek(0)
    file_type = magic.from_buffer(upload.read(1024), mime=True)
    if file_type not in allowed_filetypes:
        raise ValidationError(
            'Unsupported file')
链接地址: http://www.djcxy.com/p/47031.html

上一篇: Checking file type with django form: 'application/octet

下一篇: Html Form : bad mime type for .zip files