MVC3如何检查HttpPostedFileBase是否为图像

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

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

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

我试过了

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

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

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

您可以检查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)); } 

我也在这里写了一篇文章

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

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

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

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

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

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

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