Я ищу простой способ получить MIME-тип, где расширение файла неверно или не указано, что-то похожее на этот вопрос только в .Net.
c#
mime
mime-types
Ричард Гурлей
источник
источник
Ответы:
В Urlmon.dll есть функция с именем
FindMimeFromData
.Из документации
Итак, прочитайте первые (до) 256 байтов из файла и передайте его
FindMimeFromData
.источник
Я использовал urlmon.dll в конце. Я думал, что будет более легкий путь, но это работает. Я включил код, чтобы помочь кому-то еще и позволить мне найти его снова, если мне это нужно.
...
источник
Я нашел жестко запрограммированное решение, надеюсь, я помогу кому-нибудь:
источник
StringComparer.OrdinalIgnoreCase
конструктор словаря. Порядковое сравнение быстрее, чем инвариант, и вы избавитесь от.ToLower()
его вариаций.Изменить: просто используйте Mime Detective
Я использую последовательности байтовых массивов, чтобы определить правильный тип MIME для данного файла. Преимущество этого перед просмотром расширения файла с именем файла состоит в том, что если бы пользователь переименовал файл, чтобы обойти ограничения на загрузку определенных типов файлов, расширение имени файла не смогло бы это уловить. С другой стороны, получение подписи файла через байтовый массив предотвратит это вредное поведение.
Вот пример в C #:
Обратите внимание, что я обрабатывал типы файлов DOCX по-разному, поскольку DOCX - это просто ZIP-файл. В этом сценарии я просто проверяю расширение файла, как только убедился, что оно имеет эту последовательность. Этот пример далек от завершения для некоторых людей, но вы можете легко добавить свой собственный.
Если вы хотите добавить больше типов MIME, вы можете получить последовательности байтовых массивов многих различных типов файлов отсюда . Кроме того, вот еще один хороший ресурс, касающийся подписей файлов.
То, что я делаю много раз, если все остальное терпит неудачу, это пошагово просматривает несколько файлов определенного типа, которые я ищу, и ищу шаблон в последовательности байтов файлов. В конце концов, это все еще базовая проверка, и ее нельзя использовать для 100% подтверждения определения типов файлов.
источник
Если вы используете .NET Framework 4.5 или выше, теперь существует метод MimeMapping.GetMimeMapping (filename), который возвращает строку с правильным отображением Mime для переданного имени файла. Обратите внимание, что здесь используется расширение файла, а не данные в самом файле.
Документация находится по адресу http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping
источник
var mimetype = System.Web.MimeMapping.GetMimeMapping(<pathToFile>);
Вы также можете посмотреть в реестре.
Так или иначе, вам нужно будет подключиться к базе данных MIME - независимо от того, сопоставлены они с расширениями или магическими числами - довольно тривиально - реестр Windows - одно из таких мест. Однако для решения, не зависящего от платформы, необходимо будет отправить эту БД с кодом (или в виде отдельной библиотеки).
источник
Я использую гибридное решение:
источник
.doc
файл.HeyRed.Mime.MimeGuesser.GuessMimeType
от Nuget будет наилучшим решением, если вы хотите разместить свое решение ASP.NET в средах, отличных от Windows.Сопоставление расширений файлов очень небезопасно. Если злоумышленник загрузит недопустимые расширения, словарь сопоставления, например, позволит распространять исполняемые файлы внутри файлов .jpg. Поэтому всегда используйте библиотеку для отслеживания содержимого, чтобы узнать реальный тип содержимого.
источник
Я думаю, что правильный ответ - это комбинация ответов Стива Моргана и Сергея. Вот как это делает Internet Explorer. Pinvoke призывает
FindMimeFromData
работать только для 26 жестко запрограммированных типов пантомимы. Кроме того, это даст неоднозначные типы пантомимы (такие какtext/plain
илиapplication/octet-stream
), даже если может существовать более конкретный, более подходящий тип пантомимы. Если это не дает хороший тип пантомимы, вы можете перейти в реестр для более конкретного типа пантомимы. Реестр серверов может иметь более современные типы пантомимы.См. Http://msdn.microsoft.com/en-us/library/ms775147(VS.85).aspx
источник
Этот класс использует предыдущие ответы, чтобы попробовать 3 различными способами: хардкодирование на основе расширения, API FindMimeFromData и использование реестра.
источник
Я нашел это полезным. Для разработчиков VB.NET:
источник
Я столкнулся с той же самой проблемой и в конечном счете выбрал свой собственный вариант решения Кирка Баукома, найденный здесь .
Мне кажется, что это возможность для кого-то написать онлайн-сервис поиска.
В любом случае, надеюсь, это поможет.
источник
Если бы кто-то был за это, они могли бы перенести отличный Perl-модуль File :: Type на .NET. В коде есть набор заголовков файлов, магический номер, ищущий для каждого типа файла или соответствия регулярному выражению.
Вот библиотека обнаружения типов файлов .NET http://filetypedetective.codeplex.com/, но в настоящее время она обнаруживает лишь небольшое количество файлов.
источник
Этот ответ является копией ответа автора (Ричарда Гурлея), но улучшен для решения проблем в IIS 8 / win2012 (где из-за функции может произойти сбой пула приложений) на основе комментария Роланда, указывающего на http://www.pinvoke.net /default.aspx/urlmon.findmimefromdata
...
источник
@ Стив Морган и @ Ричард Гурлей, это отличное решение, спасибо за это. Один небольшой недостаток состоит в том, что, когда число байтов в файле составляет 255 или меньше, тип MIME иногда выдает «application / octet-stream», что немного неточно для файлов, которые, как ожидается, выдают «text / plain». Я обновил ваш оригинальный метод, чтобы учесть эту ситуацию следующим образом:
Если число байтов в файле меньше или равно 255, а выводимый тип MIME - «application / octet-stream», то создайте новый байтовый массив, состоящий из байтов исходного файла, повторенных n раз до общего числа. из байтов> = 256. Затем перепроверьте mime-тип в этом новом байтовом массиве.
Модифицированный метод:
источник
IIS 7 или более
Используйте этот код, но вы должны быть администратором на сервере
источник
При работе с веб-ролью Windows Azure или любым другим узлом, на котором ваше приложение работает в режиме «Ограниченное доверие», не забывайте, что вам не будет разрешен доступ к реестру или неуправляемому коду. Гибридный подход - сочетание словаря «попробуй поймай для реестра» и словаря в памяти выглядит как хорошее решение, в котором есть всего понемногу.
Я использую этот код, чтобы сделать это:
источник
В итоге я использовал Winista MimeDetector от Netomatix. Источники можно скачать бесплатно после создания учетной записи: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx
Это часть другого вопроса, на который здесь дан ответ: Альтернатива методу FindMimeFromData в Urlmon.dll, который имеет больше типов MIME. На мой взгляд, лучшее решение этой проблемы.
источник
Я нашел несколько проблем с запуском этого кода:
Если вы попытаетесь запустить его с x64 / Win10, вы получите
Благодаря этому посту PtrToStringUni не работает в Windows 10 и @xanatos
Я изменил свое решение для работы под x64 и .NET Core 2.1:
Спасибо
источник
Здравствуйте! Я адаптировал проект Winista.MimeDetect в ядро / инфраструктуру .net с отступлением в urlmon.dll. Не стесняйтесь использовать его: пакет nuget .
источник
mimeTypes.GetMimeTypeFromFile(bytes);
Я написал валидатор типа MIME. Пожалуйста, поделитесь этим с вами.
источник