MVC3如何检查是否HttpPostedFileBase是图像(MVC3 How to check

2019-07-31 04:36发布

我有一个这样的控制器:

public ActionResult Upload (int id, HttpPostedFileBase uploadFile)
{
....
}

我怎样才能确保uploadFile是图片(JPG,PNG等)

我曾尝试与

using (var bitmapImage = new Bitmap (uploadFile.InputStream)) {..}

这将引发ArgumentException如果BitmapImage的不能被创建。

是否有通过看uploadFile.FileName例如更好的办法?

Answer 1:

您可以检查HttpPostedFileBase对象的这一特性

  • 内容类型
  • 文件名(查看文件扩展名,你已经知道了:))

而且,这里是一个小方法,我已经准备好,你可以使用/扩展...

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

我也写了一篇文章在这这里



Answer 2:

你可以检查文件名和扩展名和MIME类型,但可能不可靠,因为用户可以简单地将文件上传之前重命名。 这里有一个可靠的方法通过查看文件的内容来实现这一目标: https://stackoverflow.com/a/6388927/29407

你当然可以这样延伸到其他已知的图像类型格式比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;
    }
}


Answer 3:

或者,您可以检查它在客户端直通HTML属性“接受”的文件尽快筛选:

@Html.TextBoxFor(x => x.HomeDeviceImage, new { @type = "file", @accept = "image/x-png, image/gif, image/jpeg" })

这仅会在您的接受属性作为默认的文件类型定义。 当心,用户仍然可以改变filetye为“所有文件”,考虑到这一点,更好的检查:

解决了关注 ,一段JavaScript代码来检查扩展,然后做一些编辑禁用像按钮:

            $('input:submit').attr('disabled', true);

直到文件的扩展名是正确的。 但有它检查服务器端。 :)



文章来源: MVC3 How to check if HttpPostedFileBase is an image