manipulacion clases archivos ruby content-type mime-types file-type

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.



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.



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>