2009-08-19 3 views
0

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

+1

первую очередь, не изобретать велосипед, используйте System.IO.Path.GetExtension, чтобы получить расширение – BlackTigerX

+1

вторых, вы упоминаете «приложения/октет-поток», как и другое, правильное и неправильное значение – BlackTigerX

ответ

3

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

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

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

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

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

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

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

2

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

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

fileExtension = System.IO.Path.GetExtension(filUpload.PostedFile.FileName);
1

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

+0

проблема заключается в том, что загруженный файл не должен быть .tif-файлом. это может быть pdf, word, текстовый файл и т. д. – Sridhar

Смежные вопросы