python - 如何从二进制字段查找文件 mimetype

标签 python django file

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

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

我创建了一个通过 id 呈现文件的 View

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 <> stream 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-magic package [pypi] 猜测 MIME 类型。您可以使用以下命令安装它(在您的虚拟环境中):

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

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

from io import BytesIO
from magic import <b>from_buffer as mime_from_buffer</b>

def media(request, file_id):
    file = get_object_or_404(File, id=file_id)
    content = file.file
    with BytesIO(content) as f:
        mimetype = <b>mime_from_buffer(</b>f.read()<b>, mime=True)</b>
    # …
    return FileResponse(content, as_attachment=False, filename=file.name)

但这只是一个猜测,并非所有文件都有一个 header 来明确它们携带的数据类型,因此最终的猜测可能是错误的。

I have a file model with a binary field

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

关于python - 如何从二进制字段查找文件 mimetype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65599820/

相关文章:

python - 使用 Pandas 将 dfs 列表从 pd.read_html 转换为 dfs

javascript - 有没有办法用 JavaScript 在 HTML 中强制硬编码样式?

python - Django 单元测试卡住了 E

python - Django过滤器查询过滤器参数是否存在

Python 多处理超时问题

python - Arduino 和 Python 通信错误

python - django 以每周每月每天的方式对查询元素进行排序

java - 如何锁定文件

java - Android 文件不存在(但同时存在!)

Ruby 文件 IO 挂起