Тип содержимого MP4 возвращается как другой тип MIME в разных браузерах - PullRequest
0 голосов
/ 16 июля 2011

У меня есть приложение ASP.NET, созданное с использованием C # для бэкэнда. У меня есть форма, которая загружает PDF-файл и проверяет MIME-тип application / pdf, чтобы убедиться, что это правильный файл. Мне нужно сделать это в отдельной форме для файлов MP4, но это не сработало. Это всегда возвращалось ложным. Я проверил возвращенный MIME-тип FileUpload.PostedFile.ContentType в webkit, который был совершенно точным. Firefox 5 и IE 8, однако, протестированы для text / csv и application / octet-stream соответственно. Это абсолютно бессмысленно для меня. Я также попытался сопоставить расширения с правильными типами MIME в файле web.config, например:

<staticContent>
  <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
  <mimeMap fileExtension=".m4v" mimeType="video/m4v" />
  <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
  <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
  <mimeMap fileExtension=".webm" mimeType="video/webm" />
</staticContent>

А в бэкэнд-файле CS я использовал это для проверки типа содержимого опубликованного файла:

if (file.PostedFile.ContentType == "video/mp4" || 
    file.PostedFile.ContentType == "video/mpeg" || 
    file.PostedFile.ContentType == "video/ogg" || 
    file.PostedFile.ContentType == "video/quicktime" || 
    file.PostedFile.ContentType == "video/webm") 
        return true;
else
        return false;

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

1 Ответ

4 голосов
/ 21 июля 2011

Это - это браузер на стороне клиента , который определяет тип контента , который получает , отправляемый на сервер . То есть браузер отправляет заголовок, который ASP.NET использует для заполнения свойства HttpPostedFile.ContentType.

Вы не можете изменить это с помощью отображений mime IIS staticContent , эти настройки применяются только к файлам, отправляемым сервером клиенту (а не наоборот).

Лучше использовать некоторый пользовательский код в своем методе c # перед размещенным вами блоком if-else, чтобы (попытаться) определить тип пантомимы real с проверка на стороне сервера . Взгляните на эти два метода, которые приводят к разным результатам и производительности:

  1. Использовать отражение для вызова метода во внутреннем .NET Framework-классе (это просто совпадает с расширением файла с теми, которые известны самому фреймворку)
  2. Используйте неуправляемый вызов IE dll (этот метод должен угадать тип mime, ищущий магических байтов внутри файла, , как вы можете прочитать в Документация MSDN )

Примечание. Вообще говоря, вы всегда должны проверять / определять тип содержимого на сервере и никогда не полагаться на тот, который был отправлен клиентом (никогда не доверяйте HttpPostedFile.ContentType): это может быть случайно неправильно (как это случилось с вами) ), преднамеренно измененный каким-то хакерским пользователем, неправильно из-за того, что браузер не соответствует какому-либо стандарту (известно, что IE отправляет неправильные типы пантомимы для некоторых форматов изображений) ...

...