Получение неверного расширения файла и типа содержимого при загрузке файла - PullRequest
0 голосов
/ 19 августа 2009

У меня есть приложение asp.net, где пользователи могут загружать файлы в нашу базу данных.

Иногда при загрузке файлов content-type устанавливается как "application/octet-stream", который является двоичным файлом.

Когда я спрашиваю пользователя, они говорят, что загрузили, говорят, что это был .tif файл. Каким-то образом управление загрузкой устанавливает его как "application/octet-stream".

Когда я загружаю тот же файл .tif с моего компьютера, он загружается с правильным типом содержимого (application/octet-stream).

Я использую следующий код, чтобы получить расширение файла

fileExtension = filUpload.PostedFile.FileName.Substring(filUpload.PostedFile.FileName.LastIndexOf(".") + 1)

иногда он возвращает расширение файла как "c:\documen" или "j:\testing" и т. Д. Я знаю, что окна не позволяют использовать специальные символы в имени файла.

Ответы [ 3 ]

3 голосов
/ 19 августа 2009

Вы просто не можете полагаться на то, что браузер предоставит используемый тип мультимедиа MIME. Клиентский компьютер может не иметь никакой информации о типе мультимедиа, настроенной для определенного типа файла (что, скорее всего, имеет место для TIFF), или он может вообще не поддерживать отправку типов мультимедиа, или могут быть ошибки в нем (так как были в прошлом с IE).

Вы также не можете полагаться на то, что браузер предоставит пригодное для использования расширение файла. Клиентский компьютер не может использовать расширения файлов для определения типа файла. (Действительно, Mac и современный Linux используют несколько механизмов для определения типа, поэтому любое расширение имени файла может вводить в заблуждение, если оно вообще присутствует.)

В этом отношении вы даже не можете полагаться на то, что браузер отправит пригодное для использования имя файла! Не каждая ОС использует символ обратной косой черты и точку для разделителей каталогов и расширений; представленное имя файла фактически является непрозрачной строкой, которую можно использовать для угадывания некоторых распространенных случаев, но вы не можете считать ее окончательной.

Таким образом, единственными разумными способами определить тип загружаемого файла являются:

  1. Спросите пользователя явно, какой тип он загружает.

  2. Попытайтесь угадать, какой это может быть тип из медиа-типа и конечного имени файла, возвращаясь к запросу пользователя, какой это тип.

  3. Если все типы, которые вы хотите разрешить, это те, у которых есть сниппируемые заголовки (как TIFF и большинство других форматов изображений), вы можете определить тип, посмотрев содержимое файла.

2 голосов
/ 19 августа 2009

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

Чтобы получить расширение, вы должны сделать это:

fileExtension = System.IO.Path.GetExtension(filUpload.PostedFile.FileName);
1 голос
/ 19 августа 2009

Я считаю, что браузер пользователя отправляет объявленный тип MIME вместе с файлом. Затем браузер должен объявить тип файла. Разные браузеры могут по-разному выводить лучший тип MIME из файла. Когда вы получите файл на своем сервере, вы можете просто проверить расширение .tif [f] - это, вероятно, все проверки, которые в любом случае выполнит загружающий браузер.

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