Как проверить содержимое загруженного файла, не полагаясь на его расширение?
-
05-07-2019 - |
Вопрос
Как вы проверяете тип загруженного файла надежно, без использования расширения? Я предполагаю, что вы должны изучить заголовок / прочитать некоторые байты, но я действительно понятия не имею, как это сделать. Я использую c # и asp.net.
Спасибо за любой совет.
<Ч>Хорошо, поэтому по указанным выше ссылкам я теперь знаю, что я ищу 'ff d8 ff e0', например, для положительной идентификации файла .jpg.
В моем коде я могу прочитать первые двадцать байтов без проблем:
FileStream fs = File.Open(filePath, FileMode.Open);
Byte[] b = new byte[20];
fs.Read(b, 0, 20);
так (и, пожалуйста, извините за мою неопытность здесь), но как мне проверить, содержит ли байтовый массив 'ff d8 ff e0'?
Решение
Вот быстрый и грязный ответ на заданный вами дополнительный вопрос:
byte[] jpg = new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 };
bool match = true;
for (int i = 0; i < jpg.Length; i++)
{
if (jpg[i] != b[i])
{
match = false;
break;
}
}
Другие советы
Это действительно то, что делает программа Unix file
с большей или меньшей степенью надежности. Частично это зависит от того, испускают ли программы, чьи файлы вы пытаетесь обнаружить, заголовок файла; программа tar
печально известна тем, что не делает этого. Это зависит от того, сколько типов файлов вы планируете попробовать и распознать, но может быть проще всего использовать реализацию file
; он распознает многие типы файлов, и современные версии расширяемы с помощью файла дополнительных определений типов файлов, которые могут обрабатывать множество сценариев.
Первые несколько байтов файла часто сообщают вам тип файла. Смотрите, например,
http://www.garykessler.net/library/file_sigs.html
http://www.astro.keele.ac.uk/ oldusers / rno / Computing / File_magic.html
Используйте System.IO для чтения байтов в двоичном виде после загрузки.
Мне любопытно, почему вы не можете полагаться на заголовок ContentType?
Wotsit - хороший ресурс для определения магических чисел для различных типов файлов.
Чтение содержимого файла - надежный способ. Поскольку вы создаете его в .Net, вы, вероятно, можете проверить MIME-тип загружаемого файла.
Вы можете помочь DllImport urlmon.dll. Пожалуйста, отправьте сообщение по адресу: http://coding-passion.blogspot.com/2008/ 11 / проверки-файлов type.html
И чтобы уточнить в отношении Content-type, он неизменно определяется расширением файла. Таким образом, даже .zip-файл получил расширение, переименованное в .txt, тип содержимого будет по-прежнему содержать только текст.