Как проверить содержимое загруженного файла, не полагаясь на его расширение?

StackOverflow https://stackoverflow.com/questions/245183

  •  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, тип содержимого будет по-прежнему содержать только текст.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top