【问题标题】:How to find file mimetype from binaryfield如何从二进制字段中查找文件 mimetype
【发布时间】:2021-01-06 16:46:07
【问题描述】:

我有一个带有二进制字段的文件模型

class File(models.Model):
    id = models.AutoField(primary_key=True)
    file = models.BinaryField()
    name = models.TextField(null=False, blank=False)

我创建了一个按 id 呈现文件的视图

def media(request, file_id):
    file = get_object_or_404(File, id=file_id)
    content = file.file
    return FileResponse(content, as_attachment=False, filename=file.name)

这是我得到的输出

%PDF-1.4 3 0 obj >>>>] /Contents 4 0 R>> endobj 4 0 obj 流 x�3R��2�35W(�*T0P�R0T(�Y @���@QC= PA�J���1Tp�W�+R@&�ҹ6f� endstream endobj 1 0 obj endobj 5 0 obj /Group /Length 19219 >> stream x ��}K�m�U����F�?��{9���������h�(�U��+�[�z;��A�����HI '4h#z��

当文件类型已知时,我可以手动将content_type 设置为application/pdfimage/png... 但这是BinaryField,我不知道用户上传了什么。无论文件类型如何,如何获得正确的 mimetype?

【问题讨论】:

    标签: python django file


    【解决方案1】:

    您可以使用python-magic package [pypi]猜测 MIME 类型。你安装这个(在你的虚拟环境中):

    pip3 install <b>python-magic</b>

    然后你可以根据字节流猜测mimetype

    from io import BytesIO
    from magic import from_buffer as mime_from_buffer
    
    def media(request, file_id):
        file = get_object_or_404(File, id=file_id)
        content = file.file
        with BytesIO(content) as f:
            mimetype = mime_from_buffer(f.read(), mime=True)
        # …
        return FileResponse(content, as_attachment=False, filename=file.name)

    但这是一个猜测,并非所有文件都有一个标头,可以清楚地表明它们携带的是哪种数据,所以最终猜测可能是错误的。

    我有一个带有二进制字段的文件模型

    在数据库中存储大型二进制流通常不是一个好主意。数据库在存储大量(二进制)数据方面通常不是很好,并且数据库在检索、存储等文件方面通常比文件系统慢。这就是为什么FileField [Django-doc] 会将检索文件的路径存储在数据库中,并将文件内容本身存储在文件系统或专用存储服务器上。

    【讨论】:

    • 我试过了,但它在mimetype = mime_from_buffer(content) 上给了我这个错误:argument 2: &lt;class 'TypeError'&gt;: wrong type
    • @AmineMessaoudi:是的,有一个错误,你需要将它包装在内存缓冲区中。
    • 现在我明白了:object of type '_io.BytesIO' has no len()
    • @AmineMessaoudi:content 的具体类型是什么? print(type(content))?
    • 我修好了。必须是这样的:mimetype = mime_from_buffer(f.read(), mime=True)。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多