【问题标题】:How to distinguish xlsx and docx files from zip archives?如何区分 zip 档案中的 xlsx 和 docx 文件?
【发布时间】:2018-01-10 13:15:50
【问题描述】:

我有一个用例,我需要知道文件的文件类型以识别可执行文件(exe、安装程序等)、存档文件(zip、rar 等)并将其列入黑名单。因此依赖扩展名对我来说是不够的,因为文件的扩展名可以更改,但文件属性将保持不变。我尝试使用 linux 命令:

file --b filename

上述解决方案适用于除 .xlsx 和 .docx 文件之外的所有文件类型,因为该命令为 .xlsx 和 .docx 提供以下内容

压缩存档数据,至少 v2.0 才能提取

因此,我最终也将 .xlsx 和 .docx 文件列入了黑名单。

任何人都可以建议我一种方法来获取文件类型,而无需使用适用于 xlsx 和 docx 的扩展名。

【问题讨论】:

  • xlsx 文件和zip 文件具有完全相同的文件结构!!! 唯一的区别是扩展名!不相信我? - 重命名文件,然后打开它。所以不,除了查看扩展名之外,没有办法区分这些特定的“文件类型”。
  • 无论如何,您在这里看到的概念是读取文件的 MIME-TYPE。有various libraries 这样做;您不需要进行外部系统调用。
  • @TomLord 所说的。这些文件遵循Office Open XML“[OOXML] 是由 Microsoft 开发的一种压缩的、基于 XML 的文件格式,用于表示电子表格、图表、演示文稿和文字处理文档。” 这种格式已经过标准化,允许读写这些文件Microsoft 以外的文档类型。在此标准之前,Microsoft 使用诸如 xlsdoc 之类的专有二进制格式,这使得与非 Microsoft 用户共享文件变得更加困难。
  • 可以找到合适的MIME类型Here

标签: ruby-on-rails ruby linux file


【解决方案1】:

您必须更新您的file 命令(或其magic 文件)。

最近的版本可以识别MSOOXML 文件:

$ file -b test.docx
Microsoft Word 2007+

$ file --version
file-5.32

【讨论】:

  • 您分享的文件对我找到答案有很大帮助。升级文件命令也存在限制,因为它是在 RHEL7(托管应用程序的操作系统)上可用的最新版本。所以我不能使用这种方法,所以继续使用 Mimemagic。
【解决方案2】:

我使用Mimemagic Gem 并添加了自定义魔法(正如 Gem 所调用的那样)来识别 xlsx、docx 和 pptx 文件格式。这也不依赖于文件扩展名。

以下是我添加的魔法列表:

[['application/vnd.openxmlformats-officedocument.wordprocessingml.document.custom', [[0, "PK\x03\x04", [[30, '_rels/.rels', [[0..5000, 'word/']]]]]]],
['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.custom', [[0, "PK\003\004", [[30, '_rels/.rels', [[0..5000, 'xl/']]]]]]],
['application/vnd.openxmlformats-officedocument.presentationml.presentation.custom', [[0, "PK\003\004", [[30, '_rels/.rels', [[0..5000, 'ppt/']]]]]]],['application/vnd.openxmlformats-officedocument.wordprocessingml.document.custom', [[0, "PK\x03\x04", [[30, 'word/']]]]],
['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.custom', [[0, "PK\003\004", [[30, 'xl/']]]]],
['application/vnd.openxmlformats-officedocument.presentationml.presentation.custom', [[0, "PK\003\004", [[30, 'ppt/']]]]]].each do |magic|
  MimeMagic.add(magic[0], magic: magic[1])
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 2021-10-19
    • 1970-01-01
    • 2010-10-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多