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);

до тех пор, пока расширение файла не будет правильным. тем не менее, он проверяется на стороне сервера.:)