25

我有一个这样的控制器:

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

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

我试过了

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

如果无法创建 bitmapImage,则会引发 ArgumentException。

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

4

3 回答 3

64

您可以HttpPostedFileBase为此检查对象的属性

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

在此处输入图像描述

这里还有一个小方法,我已经准备好了你可以使用/扩展...

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

我也在这里写了一篇关于这个的文章

于 2012-08-25T08:00:50.370 回答
20

您可以检查文件名和扩展名以及 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;
    }
}
于 2012-08-25T08:32:06.453 回答
4

或者您可以通过 html 属性“接受”在客户端检查它以尽快过滤文件:

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

这只会显示在您的默认属性中定义的文件类型。请注意,用户仍然可以将 filetye 更改为“所有文件”,考虑到这一点,最好检查一下:

解决了问题 ,一个用于检查扩展的 javascript 片段,然后进行一些编辑以禁用按钮,例如:

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

直到文件扩展名正确。尽管如此,请在服务器端进行检查。:)

于 2014-01-03T03:25:15.980 回答