【问题标题】:Django python-magic identify ppt,docx,word uploaded file as 'application/zip'Django python-magic 将 ppt、docx、word 上传的文件识别为 'application/zip'
【发布时间】:2013-07-20 17:09:24
【问题描述】:

我正在尝试识别上传文件的文件类型,搜索后,我打算使用python-magic检查文件的mime类型。

FileField 用于我的模型,ModelForm 用于帮助保存文件。

上传所有文件后,我在我的 python shell 中检查 mime 类型

我发现使用

magic.from_file("path_to_the_file", mime=True)

将为已保存的图像、txt、pdf 文件提供预期的 mime 类型。

但是,对于所有 docx、ppt、excel 文件,它会将它们标识为 'application/zip'

谁能解释为什么会发生这种情况(django 自动将 ms 文件保存为 zip 文件??)。有没有什么好方法可以让魔法识别docx、ppt、excel文件原样?

非常感谢。

【问题讨论】:

  • 仅供参考:MS office 文件是 zip 文件。 :]
  • okie,我认为它应该提供 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' 或类似信息。除了这三个和一个zip文件被识别为application/zip之外还有其他文件吗?
  • 公平地说,它应该被检测为application/msword(如果有的话)。

标签: django filefield


【解决方案1】:

我最近也遇到了这个问题。 Python-magic 使用 Unix 命令file,它使用数据库文件来识别文档(参见man file)。默认情况下,此数据库不包含有关如何识别 .docx、.pptx 和 .xlsx 文件类型的说明。

您可以通过向 /etc/magic 添加指令来向file 命令提供其他信息以识别这些类型(请参阅https://serverfault.com/a/377792)。

这应该可以工作:

magic.from_file("path_to_the_file.docx", mime=True)

返回'application/vnd.openxmlformats-officedocument.wordprocessingml.document'

从 GitHub 上的 python-magic 使用说明中需要注意的一点 - 这似乎不适用于 .docx、.pptx 和 .xlsx 文件类型(在 /etc/magic 中有附加信息):

magic.from_buffer(open("testdata/test.pdf").read(1024), mime=True)

返回'application/zip'

看来您需要提供更多数据才能正确识别这些文件类型:

magic.from_buffer(open("testdata/test.pdf").read(2000), mime=True)

返回'application/vnd.openxmlformats-officedocument.wordprocessingml.document'

我不确定所需的确切数量。

【讨论】:

  • 您的解决方案也适用于我。我查看了一个十六进制编辑器,我可以看到 libmagic 在我的测试文件中查找的位就在 1800 字节之前,但不能保证它会在哪里 - 它只是 zip 文件中的一个字符串格式。您可以在此处查看 libmagic 如何检测 OO XML:github.com/threatstack/libmagic/blob/master/magic/Magdir/… 我决定暂时传递 libmagic 2048 字节。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 2011-09-29
  • 2011-01-07
  • 1970-01-01
  • 2019-09-13
  • 2012-08-17
  • 1970-01-01
  • 2022-07-12
相关资源
最近更新 更多