是什么决定了文件应该是 application/octet-stream 还是 text/plain?

Stu*_*Cat 5 python mime

我有一段代码可以为我处理文件上传,理想情况下我只想接受文本文件(csv、制表符分隔文件等),所以我添加了这段代码:

mimetype = magic.from_buffer(request.FILES['docfile'].read(512), mime=True)
if form.is_valid() and mimetype == 'text/plain':
     ....
Run Code Online (Sandbox Code Playgroud)

就在最近,我的一位用户尝试上传一个文本文件,但系统拒绝了它,该文件的 mime 是:

file --mime-type -b input_file.txt 
application/octet-stream
Run Code Online (Sandbox Code Playgroud)

当然,之前上传的所有文件都是文本/纯文本。这两者有什么区别?是否有更“全局”的方法来检查文件是否是文本文件?

Jac*_*din 1

我发现这个答案可能是相关的:

另一种基于 file(1) 行为的方法:

textchars = bytearray({7,8,9,10,12,13,27} | set(range(0x20, 0x100)) - {0x7f})
is_binary_string = lambda bytes: bool(bytes.translate(None, textchars))
Run Code Online (Sandbox Code Playgroud)

例子:

is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
Run Code Online (Sandbox Code Playgroud)