我正在使用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”不是告诉我是否有二进制数据的万无一失的方法。这种方式是否存在,如果存在,它是什么?
答案 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