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

How do I reliably determine file type when FileMagic is not an option?

我正在使用 Rails 5.0.3。如何在不依赖文件扩展名的情况下可靠地确定文件类型(这是来自我计算机上的文件,而不是我刚从 Internet 下载的文件)?我想要一种跨平台的方式来做到这一点,只是因为我使用 Mac 进行开发,Linux 用于 test/prod。此外,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)

filemagic 不是您要找的 gem。这似乎是某人的项目,不打算供 public 消费(rubygem 页面链接到一家公司的网站,没有可用的源代码)。

而是安装 ruby-filemagic gem. Here's the source and documentation。我们可以像这样使用库:

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, a library used to identify file types using the file's magic number. The file 命令,通常在 Unix/Linux 系统上找到,使用相同的库:

$ 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 的替代品。