MVC3如何检查HttpPostedFileBase是否为图像

时间:2012-08-25 07:37:58

标签: c# asp.net-mvc-3 file-upload httppostedfilebase

我有一个像这样的控制器:

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

如何确保uploadFile是图像(jpg,png等)

我试过

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

如果无法创建bitmapImage,则会抛出ArgumentException。

有没有更好的方法,例如通过查看up​​loadFile.FileName?

3 个答案:

答案 0 :(得分:59)

您可以查看HttpPostedFileBase对象的此属性

  • 的ContentType
  • 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));
}

我还写了一篇关于这个here

的文章

答案 1 :(得分:19)

您可以检查文件名和扩展名以及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;
    }
}

答案 2 :(得分:3)

或者您可以通过html属性'accept'在客户端检查它以尽快过滤文件:

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

这只会将accept属性中定义的文件类型显示为默认值。请注意,用户仍然可以将文件更改为“所有文件”,请记住这一点,请更好地检查:

Solved concern ,一个用于检查扩展名的JavaScript代码段,然后进行一些编辑以禁用按钮,如:

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

直到文件扩展名正确。然而,它在服务器端检查。 :)