Существует ли пуленепробиваемый способ обнаружения MIME-типа загруженного файла в Ruby или Ruby on Rails? Я загружаю JPEG и PNG с помощью SWFupload и content_type
всегда "application/octet-stream"
Обнаружить MIME-тип загруженного файла в Ruby
Ответ 1
Драка ruby-filemagic сделает это:
require 'filemagic'
puts FileMagic.new(FileMagic::MAGIC_MIME).file(__FILE__)
# => text/x-ruby; charset=us-ascii
Этот драгоценный камень вообще не смотрит на расширение файла. Он читает немного содержимого файла и использует это, чтобы угадать тип файла.
Ответ 2
В Ruby on Rails вы можете:
MIME::Types.type_for("filename.gif").first.content_type # => "image/gif"
Ответ 3
Вы можете использовать эту надежную базу методов в волшебном заголовке файла:
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
Ответ 4
Ruby-filemagic gem - хорошее решение, но требует дополнительных зависимостей от libmagic (недавно удален из CarrierWave как часть удаления CarrierWave:: MagicMimeTypes).
Если вас интересует чисто рубиновая реализация, рассмотрите MimeMagic gem! Он хорошо работает для типов файлов, перечисленных в базе данных mime freedesktop.org:
require 'mimemagic'
MimeMagic.by_magic(File.open('Table-Flip-Guy.jpg')).type # => "image/jpeg"
Для форматов Microsoft Office 2007+ (xlsx, docx и pptx) требуется оверлей (если вы не согласны с общим типом MIME-типа "application/zip" для этих файлов)
require 'mimemagic'
require 'mimemagic/overlay'
MimeMagic.by_magic(File.open('big_spreadsheet.xlsx')).type # => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Ответ 5
mimemagic gem также сделает это
https://github.com/minad/mimemagic
из официальной документации
MimeMagic - это библиотека для обнаружения типа mime файла по расширению или по содержанию. Он использует базу данных mime, предоставленную freedesktop.org(см. 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...
Ответ 6
filemagic gem - хорошее решение, но зависит от множества ненужных драгоценных камней. (рельсы, aws-sdk-core,...)
Если ваше приложение мало и работает только в Linux или OSX, рассмотрите возможность использования программы file
:
require 'shellwords'
mimetype = `file --brief --mime-type - < #{Shellwords.shellescape(__FILE__)}`.strip
Примечание. Заменить __FILE__
любым expr содержит путь к файлу.
Ответ 7
Вы можете использовать
Mime:: Type.lookup_by_extension (extention_name)
Спасибо