我使用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文件,我不希望发生这种情况。
在这种情况下我该怎么做?
提前谢谢。
发布于 2020-02-26 02:32:56
作为Liyosi答案的后续,我也使用了python-magic。libmagic似乎有一个错误,它仍然错误地识别了一些文件,因为application/octet-stream在code上描述得更好
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示例:
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')发布于 2015-02-12 18:05:46
您不应该依赖提供的MIME类型,而应该依赖于从文件本身的前几个字节发现的MIME类型。
这将有助于消除泛型MIME类型问题。
这种方法的问题在于,它通常依赖于某些第三方工具(例如,Linux系统上常见的file命令很好用;将它与-b --mime -一起使用,并传入文件的前几个字节,让它为您提供mime类型)。
您的另一个选择是接受该文件,并尝试通过使用库打开它来验证它。
因此,如果pypdf无法打开该文件,并且内置的zip模块无法打开该文件,rarfile也无法打开该文件-这很可能是您不想接受的事情。
发布于 2016-08-22 12:29:44
最愚蠢的方法是通过读取文件头中的元数据来窥探文件内容。
在大多数文件中,此文件头通常存储在文件的开头,但在某些文件中,它可能位于其他位置。
python-magic可以帮助您做到这一点,但诀窍是在尝试猜测其mime类型之前,始终在文件开头重置指针,否则,如果读取器的指针已经超出文件头位置,则有时您将获得应用程序/八位位流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')https://stackoverflow.com/questions/28473613
复制相似问题