2017-05-03 1 views
10

Ich benutze Ruby 2.4 und Rails 5. Ich habe Dateiinhalt in einer Variable namens "Inhalt". Der Inhalt könnte Daten aus Dingen wie einer PDF-Datei, einer Word-Datei oder einer HTML-Datei enthalten. Gibt es eine Möglichkeit zu sagen, ob die Variable Binärdaten enthält? Letztendlich würde ich gerne wissen, ob dies eine PDF, Microsoft Office oder eine andere Art von OpenOffice-Datei ist. Diese Antwort - Rails: possible to check if a string is binary? - legt nahe, dass ich die Codierung des Gibt es eine Möglichkeit zu überprüfen, ob eine Ruby-Variable Binärdaten enthält?

content.encoding 

Variable überprüfen und es würde

ASCII-8BIT 

im Fall von binären Daten erzeugen, aber ich habe bemerkt, es gibt Fälle, in denen der in der Variablen gespeicherte HTML-Inhalt auch "ASCII-8BIT" als content.encoding zurückgeben könnte, ist die Verwendung von "content.encoding" keine sichere Methode, um mir mitzuteilen, ob ich binäre Daten habe. Gibt es einen solchen Weg und wenn ja, was ist das?

+0

Angesichts Ihrer Anforderungen, Es scheint wie du wirst h um eine Analyse des Inhalts zu machen. Ich würde die oberen n Bytes ziehen und sie gegen Ihre Standard-ASCII-Codes überprüfen. Wenn viele der gefundenen Zeichen nicht ASCII sind, ist es wahrscheinlich, dass Ihr Inhalt binär ist. Scheint so, als ob ein Chi-Quadrat-Test gut passen könnte. Warum können Sie nicht auf das eigentliche Dateiobjekt zugreifen? – Brennan

+0

Ich greife auf den Inhalt von einer Datenbank zu, in der keine zusätzlichen Informationen über die Datei vorhanden sind. Manchmal gibt es einen Dateinamen, aber Erweiterungen sind unzuverlässig, um den Datei-/Inhaltstyp zu bestimmen. – Dave

+0

Warte, der Inhalt der Datei ist in der DB? – Brennan

Antwort

4

Wenn Ihre eigentliche Frage nicht um binäre Daten per se, sondern um den Dateityp der Daten zu bestimmen, würde ich empfehlen, einen Blick auf den ruby-filemagic gem zu haben, die Ihnen diese Informationen viel zuverlässiger geben. Das Juwel ist ein einfacher Wrapper um die libmagic-Bibliothek, die auf Unix-ähnlichen Systemen Standard ist. Die Bibliothek scannt den Inhalt einer Datei und vergleicht sie mit einer Reihe bekannter "magischer" Muster in verschiedenen Dateitypen.

Verwendungsbeispiel für einen String-Puffer (zB Daten lesen Sie die Datenbank bilden):

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" 

Für das Juwel zu arbeiten (und kompilieren) benötigen Sie den file Dienstprogramm sowie die magic Bibliothek mit installierten Header auf dein System. Zitiert aus der readme:

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

Getestet gut unter Rails arbeiten 5.

+0

Hmmm, ich erhalte immer noch einen Erstellungsfehler, wenn ich versuche, dieses Juwel zu installieren - "auf -lgnurx prüfen ... nein, *** FEHLER: fehlende Bibliothek fehlt, um dieses Modul zu kompilieren". Ich werde das recherchieren müssen und dann zurückkommen und deinen Vorschlag ausprobieren. – Dave

+0

Mit welchem ​​System versuchen Sie dies? Wenn Sie nicht weiterkommen, können Sie das vollständige Protokoll mit den Fehlermeldungen posten? – BoraMa

+0

Ich habe "brew install libmagic" nicht pro Vorschlag ausgeführt. Running das erlaubt alles zu installieren. Eine Frage, die ich aus den Dokumenten nicht herausfinden konnte - druckt "buffer" Dateitypen immer konsistent aus? Das heißt, geben Excel-Dokumente immer "Microsoft Excel" aus und PDF-Dokumente drucken immer das Wort "PDF" aus? – Dave

0

Wenn Sie auf einem UNIX-Rechner sind, können Sie die Datei Befehl verwenden:

file titi.pdf 

Sie könnte dann etwas tun wie:

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

Meine Produktionsumgebung ist Ubuntu Linux, aber meine lokale Umgebung ist Mac OS X. – Dave

Verwandte Themen