Если вы хотите быть абсолютно уверенным, лучше всего проверить поток HttpPostedFileBase
на наличие магических байтов. Это связано с тем, что некоторые приложения могут записывать его как расширение, которое, как вы думаете, вы можете обрабатывать (например, MP4), но на самом деле это другой формат, такой как M4V.
Например, чтобы проверить, является ли поток потоком изменения MP4, вы можете проверить, начинается ли поток с байтов 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70 и 0x34. Вы можете найти больше форматов здесь .
Примерно так может работать:
public static bool IsMP4(System.IO.Stream stream)
{
return HasMagicBytes(stream, 0, 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34);
}
public static bool HasMagicBytes (System.IO.Stream stream, int offset, params byte[] magicBytes)
{
try {
bool match = false;
byte[] bytes = new byte[magicBytes.Length];
if (stream.Read (bytes, offset, magicBytes.Length) == magicBytes.Length) {
for (int i = 0; i < magicBytes.Length; i++) {
if (bytes [i] != magicBytes [i]) {
return false;
}
}
return true;
} else {
return false;
}
} finally {
stream.Seek (0, System.IO.SeekOrigin.Begin);
}
}
Следует позаботиться о том, чтобы поток был доступен для поиска. Этот метод довольно эффективен для больших файлов. Чтобы сделать это повторно используемым, вы можете написать ValidationAttribute, чтобы можно было определить вашу модель следующим образом:
public class MyModel
{
[CheckFormat(0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34)]
public HttpPostedFileBase MyFile { get; set; }
}
Но я оставлю это вам для дальнейшего расследования.