首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django格式检查文件类型:'application/octet-stream‘问题

问使用django格式检查文件类型:'application/octet-stream‘问题
EN

Stack Overflow用户
提问于 2015-02-12 17:20:49
回答 3查看 2.8K关注 0票数 0

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

可接受的mime类型为:‘application/pdf’,‘application/zip’,‘multipart/x-zip’,‘application/x-zip压缩’,‘application/x压缩’,‘application/rar’,‘application/x-rar’‘application/x-rar压缩’,‘压缩/rar’,

问题是,有时pdf文件似乎有'application/octet-stream‘作为mime类型。‘'application/octet-stream’表示通用的二进制文件,所以我不能简单地将该mime类型添加到接受的文件列表中,因为在这种情况下,其他文件也会被接受,例如excel文件,我不希望发生这种情况。

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

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2020-02-26 02:32:56

作为Liyosi答案的后续,我也使用了python-magic。libmagic似乎有一个错误,它仍然错误地识别了一些文件,因为application/octet-stream在code上描述得更好

代码语言:javascript
复制
    def _handle509Bug(self, e):
        # libmagic 5.09 has a bug where it might fail to identify the
        # mimetype of a file and returns null from magic_file (and
        # likely _buffer), but also does not return an error message.
        if e.message is None and (self.flags & MAGIC_MIME):
            return "application/octet-stream"
        else:
            raise e

为了解决这个问题,我必须实例化一个魔术对象并使用uncompressed和mime属性。要完成Liyosi示例:

代码语言:javascript
复制
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']
    validator = magic.Magic(uncompress=True, mime=True)
    file_type = validator.from_buffer(upload.read(), mime=True)
    if file_type not in allowed_filetypes:
        raise ValidationError('Unsupported file')
票数 1
EN

Stack Overflow用户

发布于 2015-02-12 18:05:46

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

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

这种方法的问题在于,它通常依赖于某些第三方工具(例如,Linux系统上常见的file命令很好用;将它与-b --mime -一起使用,并传入文件的前几个字节,让它为您提供mime类型)。

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-08-22 12:29:44

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

在大多数文件中,此文件头通常存储在文件的开头,但在某些文件中,它可能位于其他位置。

python-magic可以帮助您做到这一点,但诀窍是在尝试猜测其mime类型之前,始终在文件开头重置指针,否则,如果读取器的指针已经超出文件头位置,则有时您将获得应用程序/八位位流mime类型,该位置仅包含任意字节流。

例如,如果您有一个django验证器函数,它尝试验证上载的文件是否为mime类型:

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28473613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档