我有一个带有二进制字段的文件模型
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/pdf
、image/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/