我有一个像这样的控制器:
public ActionResult Upload (int id, HttpPostedFileBase uploadFile)
{
....
}
如何确保uploadFile是图像(jpg,png等)
我试过
using (var bitmapImage = new Bitmap (uploadFile.InputStream)) {..}
如果无法创建bitmapImage,则会抛出ArgumentException。
有没有更好的方法,例如通过查看uploadFile.FileName?
答案 0 :(得分:59)
您可以查看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));
}
我还写了一篇关于这个here
的文章答案 1 :(得分:19)
您可以检查文件名和扩展名以及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;
}
}
答案 2 :(得分:3)
或者您可以通过html属性'accept'在客户端检查它以尽快过滤文件:
@Html.TextBoxFor(x => x.HomeDeviceImage, new { @type = "file", @accept = "image/x-png, image/gif, image/jpeg" })
这只会将accept属性中定义的文件类型显示为默认值。请注意,用户仍然可以将文件更改为“所有文件”,请记住这一点,请更好地检查:
Solved concern ,一个用于检查扩展名的JavaScript代码段,然后进行一些编辑以禁用按钮,如:
$('input:submit').attr('disabled', true);
直到文件扩展名正确。然而,它在服务器端检查。 :)