【问题标题】:What determines whether a file should be application/octet-stream vs text/plain?什么决定了文件应该是 application/octet-stream 还是 text/plain?
【发布时间】:2017-06-21 03:24:55
【问题描述】:

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

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

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

file --mime-type -b input_file.txt 
application/octet-stream

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

【问题讨论】:

    标签: python mime


    【解决方案1】:

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

    又一个方法based on file(1) behavior:

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

    例子:

    is_binary_string(open('/usr/bin/python', 'rb').read(1024))
    True
    is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
    False
    

    【讨论】:

    • 那么处理这个问题的正确方法是接受二进制文件和文本文件吗?我问这个是因为我可以在技术上将 application/octet-stream 添加为另一种 mime 类型
    • 如果你走那条路,是的,你需要接受两者并在之后测试它们。我对 gtk 的 MIMEtypes appart 了解不多,但它似乎不是 100% 可靠的。
    猜你喜欢
    • 2023-03-08
    • 2010-11-04
    • 2010-12-25
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多