71 ruby content-type file-type mime-types
如何可靠地确定文件的类型?文件扩展名分析是不可接受的.必须有一个类似于UNIX file(1)命令的rubyesque工具?
这与MIME或内容类型有关,而与文件系统分类无关,例如目录,文件或套接字.
Mar*_*ter 58
有一个红宝石绑定到libmagic你需要的东西.它可以作为名为ruby-filemagic的宝石使用:
gem install ruby-filemagic
Run Code Online (Sandbox Code Playgroud)
要求libmagic-dev.
文档似乎有点薄,但这应该让你开始:
$ irb
irb(main):001:0> require 'filemagic'
=> true
irb(main):002:0> fm = FileMagic.new
=> #<FileMagic:0x7fd4afb0>
irb(main):003:0> fm.file('foo.zip')
=> "Zip archive data, at least v2.0 to extract"
irb(main):004:0>
Run Code Online (Sandbox Code Playgroud)
Pat*_*hie 35
如果你在Unix机器上试试这个:
mimetype = `file -Ib #{path}`.gsub(/\n/,"")
Run Code Online (Sandbox Code Playgroud)
我不知道任何纯粹的Ruby解决方案与'file'一样可靠.
编辑添加:根据您运行的操作系统,您可能需要使用'i'而不是'I'来获取文件以返回mime类型.
jam*_*iew 13
我发现炮击是最可靠的.为了兼容Mac OS X和Ubuntu Linux,我使用了:
file --mime -b myvideo.mp4
视频/ MP4; 字符集=二进制
Ubuntu还打印视频编解码器信息,如果它可以很酷:
file -b myvideo.mp4
ISO Media,MPEG v4系统,版本2
你可以使用这个可靠的方法基于文件的魔术头:
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
Run Code Online (Sandbox Code Playgroud)
这是作为对此答案的评论添加的,但实际上应该是它自己的答案:
path = # path to your file
IO.popen(
["file", "--brief", "--mime-type", path],
in: :close, err: :close
) { |io| io.read.chomp }
Run Code Online (Sandbox Code Playgroud)
我可以确认它对我有用。
如果你正在使用File类,你可以使用基于@ PatrickRichie答案的以下函数来扩充它:
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
Run Code Online (Sandbox Code Playgroud)
而且,如果您正在使用Ruby on Rails,您可以将其放入config/initializers/file.rb并在整个项目中使用.
对于那些通过搜索引擎来到这里的人来说,在纯 Ruby 中查找 MimeType 的现代方法是使用mimemagic gem。
require 'mimemagic'
MimeMagic.by_magic(File.open('tux.jpg')).type # => "image/jpeg"
Run Code Online (Sandbox Code Playgroud)
如果您认为仅使用文件扩展名是安全的,那么您可以使用mime-types gem:
MIME::Types.type_for('tux.jpg') => [#<MIME::Type: image/jpeg>]
Run Code Online (Sandbox Code Playgroud)
Bob*_*ack -3
您可以尝试使用MIME::Types for Ruby。
\n\n\n\n该库允许识别 file\xe2\x80\x99s 可能的 MIME 内容类型。MIME 内容类型的标识基于 file\xe2\x80\x99s 文件扩展名。
\n