我有一个这样的控制器:
public ActionResult Upload (int id, HttpPostedFileBase uploadFile)
{
....
}
我怎样才能确保uploadFile是图片(JPG,PNG等)
我曾尝试与
using (var bitmapImage = new Bitmap (uploadFile.InputStream)) {..}
这将引发ArgumentException如果BitmapImage的不能被创建。
是否有通过看uploadFile.FileName例如更好的办法?
您可以检查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));
}
我也写了一篇文章在这这里
你可以检查文件名和扩展名和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属性“接受”的文件尽快筛选:
@Html.TextBoxFor(x => x.HomeDeviceImage, new { @type = "file", @accept = "image/x-png, image/gif, image/jpeg" })
这仅会在您的接受属性作为默认的文件类型定义。 当心,用户仍然可以改变filetye为“所有文件”,考虑到这一点,更好的检查:
解决了关注 ,一段JavaScript代码来检查扩展,然后做一些编辑禁用像按钮:
$('input:submit').attr('disabled', true);
直到文件的扩展名是正确的。 但有它检查服务器端。 :)