我正在从文件中加载图像,我想知道在从文件中完全读取图像之前如何验证图像.
string filePath = "image.jpg";
Image newImage = Image.FromFile(filePath);
Run Code Online (Sandbox Code Playgroud)
当image.jpg不是真正的jpg时会出现问题.例如,如果我创建一个空文本文件并将其重命名为image.jpg,则在加载image.jpg时将抛出OutOfMemory Exception.
我正在寻找一个功能,它将在给定图像的流或文件路径的情况下验证图像.
示例函数原型
bool IsValidImage(string fileName);
bool IsValidImage(Stream imageStream);
Run Code Online (Sandbox Code Playgroud) 所以我正在使用此代码进行查看:
<form action="" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
这适用于型号:
[HttpPost]
public ActionResult Index(HttpPostedFileBase file) {
if (file.ContentLength > 0) {
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
file.SaveAs(path);
}
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
除非用户添加不是图像的文件,否则效果很好.如何确保上传的文件是图像.谢谢
我不想依赖文件扩展名.我不知道它是什么类型的图像(.jpg,.png等),我只是想知道文件是否是图像.如果可能的话,我宁愿不使用任何非.NET dll.
我知道如何做到这一点的最好方法如下:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
Run Code Online (Sandbox Code Playgroud)
如上所述:http://msdn.microsoft.com/en-us/library/stf701f5.aspx,如果文件不是有效的图像格式,则Image.FromFile()抛出一个OutOfMemoryException.使用上面给出了我想要的结果,但是由于以下原因我不想使用它:
Image.FromFile()将整个图像文件(如果是图像文件)加载到内存中.这是浪费我假设因为我只需要文件类型,并且在我的代码中此时不需要进行任何进一步的图像处理.OutOfMemoryExceptions,因为如果有一个真正的内存不足问题,我的程序吞下它并继续前进?有没有更好的方法来做到这一点?或者,我上面列出的任何/所有问题都是无根据的?
编辑:自从收到答案后,这些是我现在知道的三个解决方案:
Image.FromFile()try-catch 将整个图像加载到内存中.
(我没有看到明确的"赢家",因为我可以想象每个人都适合的情况.对于我的应用程序的目的,文件类型检查不经常发生,方法1的性能问题不是问题.)
我想检查目录中的图像是否为png类型但具有扩展名.bmp.以下确定它是否是.bmp扩展名
string x = Path.GetExtension(file);
Run Code Online (Sandbox Code Playgroud)
由此我们确定其扩展是.bmp.现在问题在于检查它是否是png格式.我被困在这一部分.
我这样做的原因是因为我希望我的图像透明,而.bmp图像不能很好地工作.谢谢!
此时上传恶意文件时需要扫描并删除该文件。NPM中有什么特殊的包吗?您能帮我解决这个问题吗?先谢谢了。