Как проверить содержимое загруженного файла, не полагаясь на его расширение? - PullRequest
4 голосов
/ 29 октября 2008

Как вы можете достоверно проверить тип загружаемого файла без использования расширения? Я предполагаю, что вы должны изучить заголовок / прочитать некоторые байты, но я действительно понятия не имею, как это сделать. Я использую 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'?

Ответы [ 5 ]

3 голосов
/ 29 октября 2008

Вот быстрый и грязный ответ на следующий вопрос:

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;
    }
}
2 голосов
/ 29 октября 2008

Это действительно то, что делает программа Unix file с большей или меньшей степенью надежности. Частично это зависит от того, испускают ли программы, чьи файлы вы пытаетесь обнаружить, заголовок файла; программа tar печально известна тем, что не делает этого. Это зависит от того, сколько типов файлов вы планируете попробовать и распознать, но может быть проще использовать реализацию file; он распознает многие типы файлов, и современные версии расширяемы с помощью файла дополнительных определений типов файлов, которые могут обрабатывать множество сценариев.

1 голос
/ 29 октября 2008

Wotsit - хороший ресурс для определения магических чисел для различных типов файлов.

1 голос
/ 29 октября 2008

Первые несколько байтов файла часто сообщают вам тип файла. См. Например,
http://www.garykessler.net/library/file_sigs.html
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html

Используйте System.IO для чтения байтов в двоичном виде после загрузки.

Мне любопытно, почему вы не можете положиться на заголовок ContentType?

0 голосов
/ 21 ноября 2008

Чтение содержимого файла - надежный способ. Поскольку вы создаете его в .Net, вы можете проверить MIME-тип загружаемого файла.

Вы можете помочь DllImport urlmon.dll. Пожалуйста, отправьте сообщение по адресу: http://coding -passion.blogspot.com / 2008/11 / подтверждения-файла type.html

И чтобы уточнить, что касается Content-type, он неизменно определяется расширением файла. Таким образом, даже .zip-файл получил расширение, переименованное в .txt, тип содержимого будет по-прежнему содержать только текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...