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

У меня есть приложение 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" и т. д. Я знаю, что Windows не допускает использование специальных символов в имени файла.


person Sridhar    schedule 19.08.2009    source источник
comment
во-первых, не изобретайте велосипед, используйте System.IO.Path.GetExtension, чтобы получить расширение   -  person BlackTigerX    schedule 19.08.2009
comment
во-вторых, вы упоминаете application/octet-stream как правильное, так и неправильное значение   -  person BlackTigerX    schedule 19.08.2009


Ответы (3)


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

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

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

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

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

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

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

person bobince    schedule 19.08.2009

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

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

fileExtension = System.IO.Path.GetExtension(filUpload.PostedFile.FileName);
person Jess    schedule 19.08.2009

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

person Thom Smith    schedule 19.08.2009
comment
проблема в том, что загружаемый файл не обязательно должен быть файлом .tif. это может быть pdf, word, текстовый файл и т. д. - person Sridhar; 19.08.2009