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

Dav*_*ave 3 file-type ruby-on-rails file mime-types ruby-on-rails-5

我正在使用 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)
Run Code Online (Sandbox Code Playgroud)

Cy *_*nol 5

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

相反,安装ruby-filemagicgem。这是来源文档。我们可以像这样使用这个库:

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

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

FileMagic.open(FileMagic::MAGIC_MIME) { |fm| puts fm.file("foo.txt", true) }
Run Code Online (Sandbox Code Playgroud)

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

FileMagic.mime { |fm| puts fm.file("foo.txt", true) }
Run Code Online (Sandbox Code Playgroud)

这个 gem 依赖于libmagic,这是一个用于使用文件的幻数识别文件类型的库。Unix/Linux 系统上常见的file命令使用相同的库:

$ file --mime-type foo.txt
foo.txt: text/plain
Run Code Online (Sandbox Code Playgroud)

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

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

MimeMagicFileMagic的替代品。