gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:18:28 25 4
gpt4 key购买 nike

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

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_typeapplication/pdf , image/png ... 但这是一个 BinaryField我不知道用户上传了什么。无论文件类型如何,如何获得正确的 mimetype?

最佳答案

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

pip3 install python-magic
然后就可以根据字节流猜出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)
但这是一个猜测,并非所有文件都有一个 header ,可以清楚地表明它们携带的数据类型,因此最终猜测可能是不正确的。

I have a file model with a binary field


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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com