Wie bestimmt man zuverlässig den Dateityp? Eine Analyse der Dateierweiterung ist nicht akzeptabel. Es muss ein rubyeskes Tool geben, das dem Befehl UNIX file (1) ähnelt.
Dies betrifft MIME oder den Inhaltstyp, nicht Dateisystemklassifizierungen wie Verzeichnis, Datei oder Socket.
Wenn Sie sich auf einem Unix-Computer befinden, versuchen Sie Folgendes:
mimetype = `file -Ib #{path}`.gsub(/\n/,"")
Mir sind keine reinen Ruby-Lösungen bekannt, die so zuverlässig funktionieren wie "Datei".
Bearbeitet, um hinzuzufügen: Je nachdem, welches Betriebssystem Sie ausführen, müssen Sie möglicherweise 'i' anstelle von 'I' verwenden, damit die Datei einen MIME-Typ zurückgibt.
quelle
IO.popen(["file", "--brief", "--mime-type", path], in: :close, err: :close).read.chomp
cocaine
Juwel.popen
, wenn ich anrufe , erhalte ich einen Zombie-Prozess, da das E / A-Objekt nicht geschlossen ist. Um das zu beheben, verwenden Sie einen Block:IO.popen(["file", "--brief", "--mime-type", path], in: :close, err: :close) { |io| io.read.chomp }
IO.popen(["file", "--brief", "--mime-type", path], &:read).chomp
funktioniert auch.Ich fand das Beschießen am zuverlässigsten. Aus Gründen der Kompatibilität unter Mac OS X und Ubuntu Linux habe ich Folgendes verwendet:
file --mime -b myvideo.mp4
Video / mp4; Zeichensatz = binär
Ubuntu druckt auch Video-Codec-Informationen, wenn dies möglich ist, was ziemlich cool ist:
file -b myvideo.mp4
ISO Media, MPEG v4-System, Version 2
quelle
file -b --mime-type myvideo.mp4
für die Webnutzung seinSie können diese zuverlässige Methode basierend auf dem magischen Header der Datei verwenden:
def get_image_extension(local_file_path) png = Regexp.new("\x89PNG".force_encoding("binary")) jpg = Regexp.new("\xff\xd8\xff\xe0\x00\x10JFIF".force_encoding("binary")) jpg2 = Regexp.new("\xff\xd8\xff\xe1(.*){2}Exif".force_encoding("binary")) case IO.read(local_file_path, 10) when /^GIF8/ 'gif' when /^#{png}/ 'png' when /^#{jpg}/ 'jpg' when /^#{jpg2}/ 'jpg' else mime_type = `file #{local_file_path} --mime-type`.gsub("\n", '') # Works on linux and mac raise UnprocessableEntity, "unknown file type" if !mime_type mime_type.split(':')[1].split('/')[1].gsub('x-', '').gsub(/jpeg/, 'jpg').gsub(/text/, 'txt').gsub(/x-/, '') end end
quelle
Wenn Sie die File-Klasse verwenden, können Sie sie basierend auf der Antwort von @ PatrickRichie mit den folgenden Funktionen erweitern:
class File def mime_type `file --brief --mime-type #{self.path}`.strip end def charset `file --brief --mime #{self.path}`.split(';').second.split('=').second.strip end end
Wenn Sie Ruby on Rails verwenden, können Sie dies in config / initializers / file.rb ablegen und im gesamten Projekt verfügbar haben.
quelle
Dies wurde als Kommentar zu dieser Antwort hinzugefügt , sollte aber eigentlich eine eigene Antwort sein:
path = # path to your file IO.popen( ["file", "--brief", "--mime-type", path], in: :close, err: :close ) { |io| io.read.chomp }
Ich kann bestätigen, dass es bei mir funktioniert hat.
quelle
Sie können Shared-Mime ausprobieren (gem install shared-mime-info). Erfordert die Verwendung der Freedesktop Shared-Mime-Info-Bibliothek, führt jedoch sowohl Dateinamen- / Erweiterungsprüfungen als auch "magische" Prüfungen durch. Ich habe gerade versucht, sie selbst zu testen, aber ich habe keine Freedesktop Shared-Mime-Informationen Datenbank installiert und muss leider "echte Arbeit" leisten, aber es könnte das sein, wonach Sie suchen.
quelle
Für diejenigen, die mit der Suchmaschine hierher gekommen sind, besteht ein moderner Ansatz, um den MimeType in reinem Rubin zu finden, darin, das mimemagische Juwel zu verwenden.
require 'mimemagic' MimeMagic.by_magic(File.open('tux.jpg')).type # => "image/jpeg"
Wenn Sie der Meinung sind, dass es sicher ist, nur die Dateierweiterung zu verwenden, können Sie das Juwel mime-types verwenden :
MIME::Types.type_for('tux.jpg') => [#<MIME::Type: image/jpeg>]
quelle
Reine Ruby-Lösung mit magischen Bytes und Rückgabe eines Symbols für den passenden Typ:
https://github.com/SixArm/sixarm_ruby_magic_number_type
Ich habe es geschrieben. Wenn Sie Vorschläge haben, lassen Sie es mich wissen.
quelle
Ich habe kürzlich mimetype-fu gefunden .
Es scheint die einfachste und zuverlässigste Lösung zu sein, um den MIME-Typ einer Datei zu erhalten.
Die einzige Einschränkung ist, dass auf einem Windows-Computer nur die Dateierweiterung verwendet wird, während es auf * Nix-basierten Systemen hervorragend funktioniert.
quelle
Das Beste, was ich bisher gefunden habe:
http://bogomips.org/mahoro.git/
quelle
Der Rubin Edelstein ist gut. Pantomimen für Rubin
quelle
Sie können MIME :: Types for Ruby ausprobieren .
quelle