有没有办法检查Ruby变量是否包含二进制数据?

时间:2017-05-03 19:00:04

标签: ruby-on-rails ruby encoding binary ms-office

我正在使用Ruby 2.4和Rails 5.我有一个名为“content”的变量文件内容。内容可能包含来自PDF文件,Word文件或HTML文件等内容的数据。有没有办法判断变量是否包含二进制数据?最后,我想知道这是PDf,Microsoft Office还是其他类型的OpenOffice文件。这个答案 - Rails: possible to check if a string is binary? - 表明我可以检查变量的编码

content.encoding

它会产生

ASCII-8BIT
但是,在二进制数据的情况下,我注意到存在变量中存储的HTML内容也可能返回“ASCII-8BIT”作为content.encoding,因此使用“content.encoding”不是告诉我是否有二进制数据的万无一失的方法。这种方式是否存在,如果存在,它是什么?

2 个答案:

答案 0 :(得分:4)

如果您真正的问题不是二进制数据本身,而是确定数据的文件类型,我建议您查看ruby-filemagic gem更可靠地为您提供这些信息。 gem是libmagic库的简单包装器,它是类似unix的系统的标准。该库通过扫描文件的内容并将其与一组已知的"魔法"各种文件类型的模式。

字符串缓冲区的示例用法(例如,从数据库读取的数据):

require "ruby-filemagic"

content = File.read("/.../sample.pdf") # just an example to get some data

fm = FileMagic.new
fm.buffer(content)    
#=> "PDF document, version 1.4"

要使gem工作(并编译),您需要file实用程序以及系统上安装了标头的magic库。引用自述文件:

  

文件(1)库和标题是必需的:

     

Debian / Ubuntu :: + libmagic-dev +
  Fedora / SuSE :: + file-devel +
  Gentoo :: + sys-libs / libmagic +
  OS X :: brew install libmagic

经过测试,在Rails 5下运行良好。

答案 1 :(得分:0)

如果您使用的是unix计算机,则可以使用文件命令:

file titi.pdf

然后您可以执行以下操作:

require 'open2'

cmd = 'file -'
Open3.popen3(cmd) do |stdin, stdout, wait_thr|
  stdin.write(content)
  stdin.close
  puts "file type is:" + stoud.read
end