67


18

どのようにしてファイルの種類を*確実に*決定するのでしょうか。 ファイル拡張子の分析は受け入れられません。 UNIXのfile(1)コマンドに似たルビスクツールが必要ですか。

これはMIMEやコンテンツタイプに関するもので、ディレクトリ、ファイル、ソケットなどのファイルシステムの分類ではありません。

12 Answer


58


あなたが必要とすることをする `libmagic`へのrubyバインディングがあります。 https://rubygems.org/gems/ruby-filemagic/versions/0.7.1 [ruby-filemagic]というgemとして入手できます。

gem install ruby-filemagic

`libmagic-dev`が必要です。

ドキュメンテーションは少し薄いように見えますが、これはあなたが始めるのを得るべきです:

$ irb
irb(main):001:0> require 'filemagic'
=> true
irb(main):002:0> fm = FileMagic.new
=> #
irb(main):003:0> fm.file('foo.zip')
=> "Zip archive data, at least v2.0 to extract"
irb(main):004:0>


33


Unixマシンを使っているならこれを試してください。

mimetype = `file -Ib#{path}` .gsub(/ \ n /、 "")

私は、「ファイル」のように確実に機能する純粋なRubyソリューションを知りません。

追加するために編集されます:あなたが走っているOSによっては、MIMEタイプを返すためにファイルを得るために 'I’の代わりに 'i’を使う必要があるかもしれません。


13


私は殻を出すことが最も信頼できると思いました。 私が使ったMac OS XとUbuntu Linuxの両方との互換性のために:

file --mime -b myvideo.mp4 * video / mp4;文字セット=バイナリ*

もし可能であれば、Ubuntuはビデオコーデック情報も出力します。

file -b myvideo.mp4 * ISOメディア、MPEG v4システム、バージョン2 *


8


あなたはファイルのマジックヘッダに基づいてこの信頼できるメソッドベースを使うことができます:

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"))の場合IO.read(local_file_path、10)/ ^ GIF8 / 'gif' when / ^#{png} / 'png' when / ^#{jpg} / 'jpg' when / ^#{jpg2} / 'jpg' else mime_type = `file#{local_file_path} --mime-type`.gsub ( "\ n"、 '')#LinuxおよびMac上で動作します!UnprocessableEntity、 "unknown file type"の場合!mime_type mime_type.split( ':')[1] .split( '/')[1] .gsub( 'x-'、 '').gsub(/ jpeg /、 'jpg')。gsub(/ text /、 'txt')。gsub(/ x- /、 '')end end


5


Fileクラスを使用している場合は、@ PatrickRichieの回答に基づいて次の関数を使用してそれを補強できます。

classファイル定義mime_type `file --brief --mime-type#{self.path}` .strip

def文字セット `file --brief --mime#{self.path}` .split( ';')。second.split( '=')。second.strip end end

また、Ruby on Railsを使用している場合は、これをconfig / initializers / file.rbに追加して、プロジェクト全体で使用可能にすることができます。


2


あなたは shared-mimeを試してみることができます(gem install shared-mime-info)。 Freedesktopのshared-mime-infoライブラリを使用する必要がありますが、ファイル名と拡張子のチェック、および「マジック」チェックの両方を行います…​ 今すぐ自分で試してみましたが、freedesktopのshared-mime-infoデータベースをインストールしていないので、残念ながら「本物の仕事」をする必要がありますが、それはあなたが探しているものかもしれません。


1


私は最近 mimetype-fuを見つけました。

ファイルのMIMEタイプを取得するのが最も簡単で信頼できる解決策のようです。

唯一の注意点は、Windowsマシンではファイル拡張子のみを使用するのに対し、* Nixベースのシステムでは非常にうまく機能することです。


1


マジックバイトを使用し、一致するタイプのシンボルを返す純粋なRubyソリューション

私はそれを書いたので、あなたが提案があるならば、私に知らせてください。


1


検索エンジンによってここに来た人たちにとって、純粋なルビでMimeTypeを見つけるための現代的なアプローチは mimemagic gemを使うことです。

'mimemagic'が必要

MimeMagic.by_magic(File.open( 'tux.jpg'))。type#=> "image / jpeg"

ファイル拡張子のみを使用しても安全であると思われる場合は、https://github.com/mime-types/ruby-mime-types [mime-types] gemを使用できます。

MIME :: Types.type_for( 'tux.jpg')=> [#]


0


私がこれまで見つけた最高のもの: