当FileMagic不是一个选项时,如何可靠地确定文件类型?

时间:2017-11-06 03:28:49

标签: ruby-on-rails file ruby-on-rails-5 mime-types file-type

我正在使用Rails 5.0.3。如何在不依赖文件扩展名的情况下可靠地确定文件类型(这是来自我的计算机上的文件,而不是我刚刚从Internet下载的文件)?我想要一种跨平台的方式来做这件事只是因为我使用Mac进行开发,使用Linux进行测试/生成。此外,由于此错误,gem文件魔法不是一个选项

Bundler could not find compatible versions for gem "rails":
  In Gemfile:
    rails (~> 5.0.1)

    filemagic was resolved to 0.3.5.0, which depends on
      rails (< 5, >= 4.2.0)

1 个答案:

答案 0 :(得分:3)

filemagic不是您正在寻找的宝石。这似乎是某个不打算供公众使用的项目(rubygems页面链接到公司的网站,并且没有源代码可用)。

相反,请安装ruby-filemagic gem。这是sourcedocumentation。我们可以像这样使用库:

begin
  fm = FileMagic.new(FileMagic::MAGIC_MIME)
  puts fm.file("foo.txt", true)
ensure
  fm.close
end

...或者使用open()辅助方法,它自动为我们关闭资源:

FileMagic.open(FileMagic::MAGIC_MIME) { |fm| puts fm.file("foo.txt", true) }

这也适用于另一个助手mime(),它还为我们设置了标志:

FileMagic.mime { |fm| puts fm.file("foo.txt", true) }

此gem依赖于libmagic,这是一个用于使用文件magic number识别文件类型的库。通常在Unix / Linux系统上找到的file命令使用相同的库:

$ file --mime-type foo.txt
foo.txt: text/plain

我们也可以从Ruby应用程序调用此命令来获取文件的MIME类型:

IO.popen(["file", "--mime-type", "--brief", "foo.txt"]) { |io| puts io.read.chomp }

MimeMagic是FileMagic的替代品。