检查上传的文件是否是C#ASP.NET MVC中的图像

mak*_*mbi 6 asp.net-mvc file-upload

我有我的控制器

[HttpPost]
public ActionResult ChangeAvatar(HttpPostedFileBase file)
{
    AvatarHelper.AvatarUpdate(file, User.Identity.Name);
    return RedirectToAction("Index", "Profile");
}
Run Code Online (Sandbox Code Playgroud)

我已经检查文件是否是jpeg/png格式:

private static bool IsImage(string contentType)
{   
  return AllowedFormats.Any(format => contentType.EndsWith(format,   
             StringComparison.OrdinalIgnoreCase));
}

public static List<string> AllowedFormats
{
    get { return new List<string>() {".jpg", ".png", ".jpeg"}; }
}
Run Code Online (Sandbox Code Playgroud)

我需要的是 - 它确保上传的文件是真实的图像文件,而不是带有图像扩展名的txt文件.

我将上传的文件转换为:

using (var image = System.Drawing.Image.FromStream(postedFile.InputStream))
{
          ///image stuff
}
Run Code Online (Sandbox Code Playgroud)

我在考虑从输入流创建图像的try/catch块,但我想知道是否有好的方法可以做到这一点?谢谢)

PS

我想知道是否有另一种(更有效的方式尝试/捕获阻止)方式来检查文件是否是真实的图像?

Dar*_*rov 5

您可以使用该RawFormat属性:

private static ImageFormat[] ValidFormats = new[] { ImageFormat.Jpeg, ImageFormat.Png };
public bool IsValid(Stream image)
{
    try
    {
        using (var img = Image.FromStream(file.InputStream))
        {
            return ValidFormats.Contains(img.RawFormat);
        }
    }
    catch
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以将此验证逻辑放入可重用的验证属性中,如我所示this post.