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á
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...