rails ruby-on-rails ruby file-upload swfupload

ruby on rails - rails - Detecta el tipo MIME de archivo subido en Ruby



file upload ruby on rails (7)

En Ruby on Rails puedes hacer:

MIME::Types.type_for("filename.gif").first.content_type # => "image/gif"

¿Hay una forma a prueba de balas para detectar el tipo de archivo cargado MIME en Ruby o Ruby on Rails? Estoy cargando archivos JPEG y PNG usando SWFupload y content_type siempre es "application/octet-stream"


La gema de ruby-filemagic lo hará:

require ''filemagic'' puts FileMagic.new(FileMagic::MAGIC_MIME).file(__FILE__) # => text/x-ruby; charset=us-ascii

Esta gema no mira en absoluto la extensión del archivo. Lee un poco del contenido del archivo y lo usa para adivinar el tipo de archivo.


La gema filemagic es una buena solución, pero depende de muchas gemas innecesarias. (rieles, aws-sdk-core, ...)

Si su aplicación es pequeña y solo se ejecuta en Linux o OSX, considere utilizar file programa de file :

require ''shellwords'' mimetype = `file --brief --mime-type - < #{Shellwords.shellescape(__FILE__)}`.strip

Nota: Reemplace __FILE__ con cualquier expr que contenga la ruta de archivo.


La gema ruby-filemagic es una buena solución, pero requiere dependencias adicionales en libmagic (eliminado recientemente de CarrierWave como parte de la eliminación de CarrierWave :: MagicMimeTypes ).

Si estás interesado en una implementación de Ruby puro, considera la gema MimeMagic . Funciona bien para los tipos de archivos que figuran en la base de datos de mimo freedesktop.org:

require ''mimemagic'' MimeMagic.by_magic(File.open(''Table-Flip-Guy.jpg'')).type # => "image/jpeg"

Para los formatos de Microsoft Office 2007+ (xlsx, docx y pptx), requiera la superposición (a menos que esté de acuerdo con el tipo genérico de "aplicación / zip" MIME para estos archivos)

require ''mimemagic'' require ''mimemagic/overlay'' MimeMagic.by_magic(File.open(''big_spreadsheet.xlsx'')).type # => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"


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


Puedes usar

Mime :: Type.lookup_by_extension (extention_name)

Gracias


la gema mimemagic también lo hará

MimeMagic

de la documentación oficial

MimeMagic es una biblioteca para detectar el tipo de mime de un archivo por extensión o por contenido. Utiliza la base de datos mime proporcionada por freedesktop.org (ver http://freedesktop.org/wiki/Software/shared-mime-info/ ).

require ''mimemagic'' MimeMagic.by_extension(''html'').text? MimeMagic.by_extension(''.html'').child_of? ''text/plain'' MimeMagic.by_path(''filename.txt'') MimeMagic.by_magic(File.open(''test.html'')) # etc...