我以字节数组的形式存储我的网站图像,但是当我尝试将其保存为jpeg文件时,此文件中的某些文件会引发异常。这是我获取图像的代码:
IList<PropertyInfo> properties = typeof(ApplicationUser).GetProperties()
.Where(x => x.PropertyType == typeof(Byte[])).ToList();
var imaBytes = property.GetValue(user, null) as Byte[];
if (imaBytes == null || imaBytes.Length == 0) continue;
Image userImage = ImageHelper.byteArrayToImage(imaBytes);
userImage.Save(pathname + $@"\{DirName}\" + property.Name + ".jpg", ImageFormat.Jpeg);
这是我的ImageHelper.byteArrayToImage
:
public static Image byteArrayToImage(byte[] byteArrayIn)
{
try
{
using (MemoryStream ms = new MemoryStream(byteArrayIn))
using (var image = Image.FromStream(ms,false,true))
{
byteArrayIn = new byte[0];
return new Bitmap(image);
}
}
catch (Exception e)
{
Logger.log(e);
}
}
编辑:
我使用声明包装MemoryStream和Image代码,并更改代码并添加ImageToDisk方法:
public static void ImageToDisk(byte[] byteArrayIn, string pathToSave)
{
try
{
using (MemoryStream ms = new MemoryStream(byteArrayIn))
{
using (var image = Image.FromStream(ms, false, true))
{
image.Save(pathToSave, ImageFormat.Jpeg);
image.Dispose();
}
}
}
catch (Exception e)
{
Logger.log(e);
throw;
}
}
和主要代码是这个
foreach (var property in properties)
{
try
{
var imaBytes = property.GetValue(user, null) as Byte[];
if (imaBytes == null || imaBytes.Length == 0)
{
continue;
}
ImageHelper.ImageToDisk(imaBytes, pathname + $@"\{DirName}\" + property.Name + ".jpg");
}
catch (Exception ex)
{
LogException(ex);
}
}
但现在获得system.runtime.interopservices.externalexception
编辑2:
我完全头晕!似乎有些用户从IE和IE上传图像,将MIME类型更改为image / PJPEG
发生错误的原因是某些具有此MIME类型的文件,但还有其他image/PJPEG
个文件正确保存而没有任何异常
我该如何解决这个错误?
答案 0 :(得分:3)
某些文件抛出异常
我几乎可以确定问题出在处理图像上。确保释放所有资源:
using (Image userImage = ImageHelper.byteArrayToImage(imaBytes))
{
//do whatever you need
userImage.Save(pathname + $@"\{DirName}\" + property.Name + ".jpg", ImageFormat.Jpeg);
}
位图会占用大量内存。 Image
使用GdipLoadImageFromStream
方法。要释放资源,应将其与GdipDisposeImage
配对。这就是Image.Dispose()
方法内部的情况。