clases - file ruby
Determinar el tipo de archivo en Ruby (12)
La gema de rubí está bien. mime-types para ruby
¿Cómo se puede determinar de manera confiable el tipo de archivo? El análisis de extensión de archivo no es aceptable. Debe haber una herramienta rubyesque similar al comando UNIX file (1)?
Se trata de MIME o del tipo de contenido, no de las clasificaciones del sistema de archivos, como el directorio, el archivo o el socket.
Lo mejor que he encontrado hasta ahora:
Me pareció que bombardear para ser el más confiable. Para compatibilidad tanto en Mac OS X como en Ubuntu Linux, utilicé:
file --mime -b myvideo.mp4
video / mp4; charset = binario
Ubuntu también imprime la información del códec de video si puede, lo cual es genial:
file -b myvideo.mp4
ISO Media, sistema MPEG v4, versión 2
Para aquellos que vinieron aquí por el motor de búsqueda, un enfoque moderno para encontrar el MimeType en rubí puro es usar la gema mimemagic .
require ''mimemagic''
MimeMagic.by_magic(File.open(''tux.jpg'')).type # => "image/jpeg"
Si crees que es seguro usar solo la extensión de archivo, entonces puedes usar la gema mime-types :
MIME::Types.type_for(''tux.jpg'') => [#<MIME::Type: image/jpeg>]
Podrías probar con MIME :: Types for Ruby .
Esta biblioteca permite la identificación del tipo de contenido MIME probable de un archivo. La identificación del tipo de contenido MIME se basa en las extensiones de nombre de archivo de un archivo.
Podrías probar try-mime compartido (gem install shared-mime-info). Requiere el uso de la biblioteca de información de mimo compartida de Freedesktop, pero tanto las verificaciones de nombre de archivo / extensión como las verificaciones "mágicas" ... intenté darle un giro solo ahora, pero no tengo el freedesktop shared-mime-info la base de datos instalada y tiene que hacer un "trabajo real", desafortunadamente, pero podría ser lo que está buscando.
Puede utilizar esta base de método confiable en el encabezado mágico del archivo:
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
Recientemente encontré mimetype-fu .
Parece ser la solución más fácil y confiable para obtener el tipo MIME de un archivo.
La única advertencia es que en una máquina Windows solo utiliza la extensión de archivo, mientras que en los sistemas basados en * Nix funciona muy bien.
Si está utilizando la clase File, puede aumentarla con las siguientes funciones basadas en la respuesta de @ 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
Y, si está usando Ruby on Rails, puede soltar esto en config / initializers / file.rb y tenerlo disponible durante todo el proyecto.
Si estás en una máquina Unix prueba esto:
mimetype = `file -Ib #{path}`.gsub(//n/,"")
No conozco ninguna solución pura de Ruby que funcione tan confiablemente como ''archivo''.
Editado para agregar: dependiendo del sistema operativo que esté ejecutando, es posible que necesite usar ''i'' en lugar de ''I'' para que el archivo devuelva un tipo mime.
Solución de Pure Ruby que utiliza bytes mágicos y devuelve un símbolo para el tipo coincidente:
https://github.com/SixArm/sixarm_ruby_magic_number_type
Lo escribí, así que si tienes sugerencias, házmelo saber.
Hay un rubí vinculante para libmagic
que hace lo que necesita. Está disponible como una gema llamada ruby-filemagic :
gem install ruby-filemagic
Requiere libmagic-dev
.
La documentación parece un poco escasa, pero esto debería comenzar:
$ 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>