Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何区分xlsx和docx文件与zip归档文件?_Ruby On Rails_Ruby_Linux_File - Fatal编程技术网

Ruby on rails 如何区分xlsx和docx文件与zip归档文件?

Ruby on rails 如何区分xlsx和docx文件与zip归档文件?,ruby-on-rails,ruby,linux,file,Ruby On Rails,Ruby,Linux,File,我有一个用例,我需要知道文件的文件类型,以识别和黑名单的可执行文件(exe,安装程序等),存档文件(zip,rar等)。因此,依赖扩展名对我来说是不够的,因为文件的扩展名可以更改,但文件属性将保持不变。我尝试使用linux命令: file --b filename 除了.xlsx和.docx文件外,上述解决方案可以完美地处理所有文件类型,因为该命令为.xlsx和.docx文件提供了以下内容 压缩存档数据,至少要提取v2.0版 因此,我最终将.xlsx和.docx文件也列入黑名单 有谁能给我一个

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

file --b filename
除了.xlsx和.docx文件外,上述解决方案可以完美地处理所有文件类型,因为该命令为.xlsx和.docx文件提供了以下内容

压缩存档数据,至少要提取v2.0版

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


有谁能给我一个不使用xlsx和docx扩展名的文件类型获取方法。

您必须更新
文件
命令(或其魔法文件)

最新版本不识别文件:

我使用并添加了自定义魔术(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

xlsx
文件和
zip
文件具有完全相同的文件结构!!!唯一的区别是扩展名!你不相信我吗重命名该文件,然后将其打开。因此,除了查看扩展名,没有办法区分这些特定的“文件类型”。无论如何,您在这里看到的概念是读取文件的MIME类型。有人这样做;你不需要进行外部系统调用。@TomLord说的。这些文件都是根据。“[OOXML]是Microsoft开发的一种基于XML的压缩文件格式,用于表示电子表格、图表、演示文稿和字处理文档。”该格式已标准化,允许在Microsoft之外阅读和编写这些文档类型。在此标准之前,microsoft使用了诸如
xls
doc
之类的专有二进制格式,这使得与非microsoft用户共享文件更加困难。可以找到合适的MIME类型您共享的文件帮助我找到了答案。此外,升级file命令也有限制,因为它是RHEL7(应用程序所在的操作系统)的最新版本。所以我不能使用这种方法,所以继续使用Mimemagic。
[['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