MVC3 Как проверить, является ли HttpPostedFileBase изображение
У меня такой контроллер:
public ActionResult Upload (int id, HttpPostedFileBase uploadFile)
{
....
}
Как я могу убедиться, что uploadFile - это изображение (jpg, png и т.д.).
Я пробовал с
using (var bitmapImage = new Bitmap (uploadFile.InputStream)) {..}
который генерирует исключение ArgumentException, если bitmapImage не может быть создан.
Есть ли лучший способ, например, глядя на uploadFile.FileName?
Ответы
Ответ 1
Вы можете проверить свойства объекта HttpPostedFileBase
для этого
- ТипСодержимого
- FileName (проверьте расширения файлов, о которых вы уже знаете:))
![enter image description here]()
Также здесь небольшой метод, который я подготовил, который вы можете использовать/расширять...
private bool IsImage(HttpPostedFileBase file)
{
if (file.ContentType.Contains("image"))
{
return true;
}
string[] formats = new string[] { ".jpg", ".png", ".gif", ".jpeg" }; // add more if u like...
// linq from Henrik Stenbæk
return formats.Any(item => file.FileName.EndsWith(item, StringComparison.OrdinalIgnoreCase));
}
Я также написал статью об этом здесь
Ответ 2
Вы можете проверить имя файла и расширение и тип MIME, но это может быть ненадежным, поскольку пользователь может просто переименовать файл перед загрузкой. Здесь надежный способ добиться этого, посмотрев содержимое файла: fooobar.com/questions/32190/...
Вы могли бы, конечно, распространить это на другие известные форматы типов изображений, чем PNG, например:
public class ValidateFileAttribute : RequiredAttribute
{
public override bool IsValid(object value)
{
var file = value as HttpPostedFileBase;
if (file == null)
{
return false;
}
if (file.ContentLength > 1 * 1024 * 1024)
{
return false;
}
try
{
var allowedFormats = new[]
{
ImageFormat.Jpeg,
ImageFormat.Png,
ImageFormat.Gif,
ImageFormat.Bmp
};
using (var img = Image.FromStream(file.InputStream))
{
return allowedFormats.Contains(img.RawFormat);
}
}
catch { }
return false;
}
}
Ответ 3
Или вы можете проверить его на стороне клиента через атрибут html "accept" для фильтрации файла как можно скорее:
@Html.TextBoxFor(x => x.HomeDeviceImage, new { @type = "file", @accept = "image/x-png, image/gif, image/jpeg" })
это будет показывать только значения типов файлов, определенные в вашем атрибуте accept. Опасайтесь, пользователь все равно может изменить filetye на "Все файлы", имея в виду это, лучше проверьте это:
Решенный вопрос
, фрагмент javascript для проверки расширения, а затем выполните некоторые изменения, чтобы отключить кнопку, например:
$('input:submit').attr('disabled', true);
до тех пор, пока расширение файла не будет правильным. тем не менее, он проверяется на стороне сервера.:)