Есть ли пуленепробиваемый способ обнаружения MIME-типа загруженного файла в Ruby или Ruby on Rails? Я загрузка JPEGs и PNGs с помощью SWFUpload и content_type
всегда "application/octet-stream"
Обнаружить MIME-тип загружаемого файла в Ruby
ответ
ruby-filemagic камня сделает это:
require 'filemagic'
puts FileMagic.new(FileMagic::MAGIC_MIME).file(__FILE__)
# => text/x-ruby; charset=us-ascii
Этого камень не смотрит на расширении файла на всех. Он читает немного содержимого файла и использует это, чтобы угадать тип файла.
В Ruby на Rails вы можете сделать:
MIME::Types.type_for("filename.gif").first.content_type # => "image/gif"
> Возвращает список MIME :: Типы, принадлежащие файлу, на основе его расширения имени файла. Если платформа истинна, то будут возвращены только типы файлов, которые относятся к текущей платформе. – knoopx
Недействительный ответ, он просто определяет тип файла на основе его расширения. Если вы назовете PNG-файл с расширением FLV, он обнаружит, что он будет => «video/x-flv» –
Может быть достаточно хорошим, если вы обеспечите согласованное расширение файла. –
Вы можете использовать этот надежный метод базы на волшебном заголовке файла:
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
Использование строковой интерполяции при запуске внешней команды в backticks, как правило, не очень хорошая идея. 'local_file_path' может быть установлен в'; rm -rf .'. В этом конкретном случае метод будет безопасно терпеть неудачу с «Errno :: ENOENT» без очистки текущего каталога, но лучше не полагаться на это, когда имя файла предоставляется пользователем. – rekado
Вы можете использовать
Мим: : Type.lookup_by_extension (extention_name)
С благодарностью
Downvoted, потому что расширение не имеет ничего общего с фактическим типом файла. Возможно, не будет расширения. – panzi
Может быть достаточно хорошим, если вы обеспечите согласованное расширение файла. – NARKOZ
-1, потому что это увековечивает веру в то, что расширения файлов связаны с типом файла (Windows - это единственное место, где это точно). – Dan
рубинового filemagic драгоценного камня хорошее решение, но требует дополнительных зависимостей от libmagic (недавно удален из CarrierWave как часть CarrierWave :: MagicMimeTypes удаления).
Если вас интересует чисто рубиновая реализация, рассмотрите драгоценный камень MimeMagic! Он хорошо работает для типов файлов, перечисленных в базе данных freedesktop.org мима:
require 'mimemagic'
MimeMagic.by_magic(File.open('Table-Flip-Guy.jpg')).type # => "image/jpeg"
Для Microsoft Office 2007+ форматов (XLSX, DOCX и PPTX), требует наложения (если вы не в порядке с родовым " Приложение/зип»MIME тип для этих файлов)
require 'mimemagic'
require 'mimemagic/overlay'
MimeMagic.by_magic(File.open('big_spreadsheet.xlsx')).type # => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
mimemagic камень будет также сделать это
https://github.com/minad/mimemagic
из Официальной документации
MimeMagic is a library to detect the mime type of a file by extension or by content. It uses the mime database provided by freedesktop.org (see 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...
filemagic gem - хорошее решение, но зависит от множества ненужных драгоценных камней. (Рельсы, AWS-СДК-ядро, ...)
Если ваше приложение маленькое и работает только в Linux или OSX, рассмотреть возможность использование file
программы:
require 'shellwords'
mimetype = `file --brief --mime-type - < #{Shellwords.shellescape(__FILE__)}`.strip
Примечания: Заменить __FILE__
с любым выражом содержит путь к файлу.
- 1. Признать фактический тип загружаемого файла?
- 2. Как изменить способ создания загружаемого файла загружаемого файла Log4Net?
- 3. Mime-типа загружаемого файла
- 4. сохранение копии загружаемого файла
- 5. Ошибка загружаемого текстового файла
- 6. Минимальный размер загружаемого файла
- 7. Предварительный просмотр загружаемого файла
- 8. Размер загружаемого файла
- 9. Ошибка загрузки загружаемого файла
- 10. Местоположение загружаемого файла в javascript
- 11. Размер загружаемого файла углов
- 12. Подтвердить расширение загружаемого файла
- 13. Подтвердить размер загружаемого файла
- 14. файла проблема размера загружаемого файла в asp.net
- 15. Создание загружаемого файла zip-файла Sitemap в Heroku
- 16. Как найти размер загружаемого файла?
- 17. Изменить максимальный размер загружаемого файла
- 18. Проблема с загрузкой загружаемого файла
- 19. Как рассчитать процент загружаемого файла?
- 20. Ansible: ошибка загружаемого файла bookate_to
- 21. переменная роль загружаемого файла воспроизведения
- 22. Получить последний кусок загружаемого файла
- 23. Django отображение содержимого загружаемого файла
- 24. Как переименовать кнопку загружаемого файла
- 25. ограничить размеры загружаемого файла изображения
- 26. Максимальный размер загружаемого файла PHP
- 27. Изменить имя загружаемого файла ItextSharp
- 28. asp: получить имя файла для загружаемого файла
- 29. «Нет такого файла каталога» для загружаемого файла
- 30. WCF. Загрузка загружаемого загружаемого файла сервиса с поддержкой нескольких платформ.
На OS X Мне просто нужно было «заварить установку libmagic» до того, как «gem install ruby-filemagic» будет работать. Но драгоценный камень работает как шарм для изображения/png, image/jpg, application/x-shockwave-flash, video/mp4, application/ogg, image/vnd.adobe.photoshop, application/pdf, video/x-ms- asf и т. д. –
'apt-get install libmagic-dev', если вы на Ubuntu. – wpp
Чтобы уточнить (и контрастировать с ответом @ NARKOZ), этот жемчуг не смотрит на расширение, чтобы найти тип mime, в отличие от опции MIME :: types. – alexanderbird