当前位置:  开发笔记 > 后端 > 正文

确定Ruby中的文件类型

如何解决《确定Ruby中的文件类型》经验,为你挑选了5个好方法。

如何可靠地确定文件的类型?文件扩展名分析是不可接受的.必须有一个类似于UNIX file(1)命令的rubyesque工具?

这与MIME或内容类型有关,而与文件系统分类无关,例如目录,文件或套接字.



1> Martin Carpe..:

有一个红宝石绑定到libmagic你需要的东西.它可以作为名为ruby-filemagic的宝石使用:

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> 


我很高兴地报告这个宝石再次被积极维护https://github.com/blackwinter/ruby-filemagic

2> Patrick Ritc..:

如果你在Unix机器上试试这个:

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

我不知道任何纯粹的Ruby解决方案与'file'一样可靠.

编辑添加:根据您运行的操作系统,您可能需要使用'i'而不是'I'来获取文件以返回mime类型.


为了防止令人讨厌的hackery,请尝试使用popen:`IO.popen(["file"," - brief"," - mime-type",path],in :: close,err :: close).read.chomp `
@ sj26每当我调用`popen`时,我都会得到一个僵尸进程,因为IO对象没有关闭.要修复它,请使用块:`IO.popen(["file"," - brief"," - mime-type",path],in :: close,err :: close){| io | io.read.chomp}`

3> 小智..:

我发现炮击是最可靠的.为了兼容Mac OS X和Ubuntu Linux,我使用了:

file --mime -b myvideo.mp4
视频/ MP4; 字符集=二进制

Ubuntu还打印视频编解码器信息,如果它可以很酷:

file -b myvideo.mp4
ISO Media,MPEG v4系统,版本2


应该是`file -b --mime-type myvideo.mp4`用于web使用

4> Alain Beauvo..:

你可以使用这个可靠的方法基于文件的魔术头:

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



5> spyle..:

如果你正在使用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

而且,如果您正在使用Ruby on Rails,您可以将其放入config/initializers/file.rb并在整个项目中使用.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有