如何区分xlsx和docx文件与zip档案?

时间:2018-01-10 13:15:51

标签: ruby-on-rails ruby linux file

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

file --b filename

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

  

Zip档案数据,至少提取v2.0

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

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

2 个答案:

答案 0 :(得分:1)

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

最近版本确实识别MSOOXML个文件:

$ file -b test.docx
Microsoft Word 2007+

$ file --version
file-5.32

答案 1 :(得分:0)

我使用了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