2017-05-03 72 views
10

我正在使用Ruby 2.4和Rails 5.我在名爲「content」的變量中有文件內容。內容可能包含來自PDF文件,Word文件或HTML文件之類的數據。有什麼辦法可以告訴變量是否包含二進制數據?最終,我想知道這是一個PDf,Microsoft Office還是其他類型的OpenOffice文件。這個答案 - Rails: possible to check if a string is binary? - 表明,我可以檢查的變量有沒有辦法來檢查一個Ruby變量是否包含二進制數據?

content.encoding 

編碼,它會在二進制數據的情況下產生

ASCII-8BIT 

,但是,我注意到有存儲在變量中的HTML內容也可能返回「ASCII-8BIT」作爲content.encoding的情況,所以使用「content.encoding」並不是一種簡單的方法告訴我是否有二進制數據。這種方式是否存在?如果是這樣,它是什麼?

+0

鑑於您的要求,它看起來像你會h大家對內容做一些分析。我會拉最高的n個字節,並根據您的標準ASCII碼檢查它們。如果您遇到的許多字符不是ASCII,則很可能您的內容是二進制文件。看起來像卡方測試可能是一個很好的選擇。爲什麼你不能訪問實際的文件對象? – Brennan

+0

我正在訪問數據庫中沒有關於該文件的其他信息的內容。有時候會有文件名,但擴展名對於確定文件/內容類型是不可靠的。 – Dave

+0

等等,文件的內容在DB中? – Brennan

回答

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" 

對於創業板的工作(和編譯)你需要的file工具以及與安裝在頭部的magic庫你的系統。自述報價:

The file(1) library and headers are required:

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

測試下的Rails以及工作5

+0

嗯,當我嘗試安裝這個gem時,我仍然遇到了構建錯誤 - 「檢查-lgnurx ...不,***錯誤:缺少編譯此模塊所需的庫」。我將不得不研究,然後回來嘗試你的建議。 – Dave

+0

你在試用這個系統?如果您遇到困難,您是否可以在完整日誌中發佈錯誤消息? – BoraMa

+0

我沒有按照你的建議運行「brew install libmagic」。運行,確實允許一切安裝。有一個問題我沒有從文檔中找出來 - 「緩衝區」是否始終以一致的方式打印文件類型?也就是說,Excel文檔總是輸出「Microsoft Excel」,而PDF文檔總是打印出「PDF」這個詞? – Dave

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 
+0

我的生產環境是Ubuntu Linux,但我的本地環境是Mac OS X. – Dave

相關問題