我有我的控制器
[HttpPost]
public ActionResult ChangeAvatar(HttpPostedFileBase file)
{
AvatarHelper.AvatarUpdate(file, User.Identity.Name);
return RedirectToAction("Index", "Profile");
}
我已经检查过文件是否为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"}; }
}
我需要的是 - 它确保上传的文件是真实的图像文件,而不是带有图像扩展名的txt文件。
我将上传的文件转换为:
using (var image = System.Drawing.Image.FromStream(postedFile.InputStream))
{
///image stuff
}
我正在考虑从输入流创建图像的try / catch块,但我想知道是否有好的方法可以做到这一点? 感谢)
P.S。
我想知道是否还有另一种(更有效的方式尝试/捕获阻止)方式来检查文件是否是真实图像?
答案 0 :(得分: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;
}
}
此外,您可以将此验证逻辑放入可重复使用的验证属性中,如我在this post
中所示。
答案 1 :(得分:2)
我的解决方案作为扩展,实际上检查base64字符串是否是图像:
public static bool IsImage(this string base64String)
{
byte[] imageBytes = Convert.FromBase64String(base64String);
var stream = new MemoryStream(imageBytes, 0, imageBytes.Length);
try
{
stream.Write(imageBytes, 0, imageBytes.Length);
System.Drawing.Image image = System.Drawing.Image.FromStream(stream, true);
return true;
}
catch (Exception)
{
return false;
}
}
用法:
if(!"base64string".IsImage())
throw new Exception("Not an image");