我有一个功能,可以在注册时将用户个人资料图像保存到服务器。
我的问题:为了安全起见,我检查图像以确保其有效类型。但是当我这样做时,我似乎擦除了流,无法将图像写入服务器。
如何检查文件的安全性而不破坏流?问题出现在函数IsValidImage
。
private string GetUploadedImage(HttpFile imageFile, long userId, IRootPathProvider pathProvider)
{
// the following call wipes imageFile.Value or corrupts it
if (!IsValidImage(imageFile.Value))
return string.Empty;
string path = Path.Combine(pathProvider.GetRootPath() + "/abc/", userId + Path.GetExtension(imageFile.Name));
Directory.CreateDirectory(Path.GetDirectoryName(path));
using (var fileStream = new FileStream(path, FileMode.Create))
{
imageFile.Value.CopyTo(fileStream);
}
return path;
}
private bool IsValidImage(Stream image)
{
ImageFormat[] ValidFormats = new[] { ImageFormat.Jpeg, ImageFormat.Png };
try
{
// this wipes or corrupts the stream. How can I avoid this?
using (var img = Image.FromStream(image))
{
return ValidFormats.Contains(img.RawFormat);
}
}
catch
{
return false;
}
}
答案 0 :(得分:0)
一旦您从流中读取(IsValidImage使用Image.FromStream
),您需要"倒带"它可以重新读取数据。
您可以通过设置位置来执行此操作:
using (var fileStream = new FileStream(path, FileMode.Create))
{
imageFile.Value.Position= 0;
imageFile.Value.CopyTo(fileStream);
}