Rubyでファイル名の拡張子を見つける


103

Railsアプリのファイルアップロード部分の作業をしています。異なるタイプのファイルは、アプリによって異なる方法で処理されます。

特定のファイル拡張子のホワイトリストを作成して、アップロードされたファイルをチェックして、どこに行くべきかを確認したいと思います。ファイル名はすべて文字列です。

ファイル名文字列の拡張子部分のみをチェックする方法が必要です。ファイル名はすべて「some_file_name.some_extension」の形式です。

回答:


167

それは本当に基本的なことです:

irb(main):002:0> accepted_formats = [".txt", ".pdf"]
=> [".txt", ".pdf"]
irb(main):003:0> File.extname("example.pdf") # get the extension
=> ".pdf"
irb(main):004:0> accepted_formats.include? File.extname("example.pdf")
=> true
irb(main):005:0> accepted_formats.include? File.extname("example.txt")
=> true
irb(main):006:0> accepted_formats.include? File.extname("example.png")
=> false

4
いかが"file_with_no_extension".split('.').lastですか?
2011年

12
残念ながら、これはtar.gz、などの複数期間のサフィックスでは機能しませんtar.bz2
KomodoDave

2
@KomodoDaveは、拡張のヒューリスティックな(したがってエラーが発生しやすい)データベースを除いて、複数期間のサフィックスでは機能しません。
Ciro Santilli郝海东冠状病六四事件法轮功

4
File.extname("example.png").downcase拡張機能がすべて大文字ではないことを確認するために実行する必要があります
Sam Eaton

@CiroSantilli六四事件法轮功包卓轩最初のドットの後に何かを含めることを選択しない限り...しかし、人々はドットでファイル名を作成するので、そうです、そうです、どちらの方法もエラーが発生しやすいので、それに同意します。
Luc

78

extnameFileクラスのメソッドを使用する

File.extname("test.rb")         #=> ".rb"

また、あなたは、必要があるかもしれませんbasename方法を

File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

16

かなり古いトピックですが、拡張セパレーターのドットと後続のスペースの可能性を取り除く方法は次のとおりです。

File.extname(path).strip.downcase[1..-1]

例:

File.extname(".test").strip.downcase[1..-1]       # => nil
File.extname(".test.").strip.downcase[1..-1]      # => nil
File.extname(".test.pdf").strip.downcase[1..-1]   # => "pdf"
File.extname(".test.pdf ").strip.downcase[1..-1]  # => "pdf"

0

これを行うと、延長セパレーターに乗るのが簡単になりませんか?

File.extname(path).delete('.')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.