所以我需要在我的应用程序中验证图像上传。我正在使用一些我可能从这里获得的代码并且发生了一些非常奇怪的事情。首先,我的验证工作方式是使用流畅的自定义验证类。对于图像验证,我只是验证HttpPostedFileBase
字段,然后我使用一个小帮助函数将其转换为字节数组,然后将其保存到我的数据库中。现在是奇怪的部分..
当我不在字段上应用验证器时,图像上传,转换为字节数组和保存到数据库工作正常。但是当我使用验证器时,我最终得到一个空字节数组。所以我想知道我的验证课如何影响该领域发布的内容。
这是我的图像验证器类:
public class ImageValidator : PropertyValidator
{
public ImageValidator()
: base("The allowed formats for the Image are JPEG, PNG and GIF and the maximum allowed size is 1MB.")
{
}
protected override bool IsValid(PropertyValidatorContext context)
{
dynamic viewModel = context.Instance;
var isValid = false;
HttpPostedFileBase image = viewModel.UploadedImage;
if (image == null)
return true;
if (image.ContentLength > 1 * 1024 * 1024)
return false;
if (IsFileTypeValid(image))
{
isValid = true;
}
return isValid;
}
private bool IsFileTypeValid(HttpPostedFileBase image)
{
try
{
using (var img = Image.FromStream(image.InputStream))
{
if (IsOneOfValidFormats(img.RawFormat))
{
return true;
}
}
}
catch
{
return false;
}
return false;
}
private bool IsOneOfValidFormats(ImageFormat rawFormat)
{
var formats = getValidFormats();
return formats.Contains(rawFormat);
}
private IEnumerable<ImageFormat> getValidFormats()
{
var formats = new List<ImageFormat> { ImageFormat.Png, ImageFormat.Jpeg, ImageFormat.Gif };
return formats;
}
}
这是我转换为字节数组的函数(以后我不会再问这个问题):
public static byte[] UploadedImageToByteArray(HttpPostedFileBase uploadedImage)
{
var target = new MemoryStream();
uploadedImage.InputStream.CopyTo(target);
return target.ToArray();
}
考虑到验证类似乎是问题,我不会过分关注UploadedImageToByteArray
函数。
编辑:
好的甚至更奇怪的事情正在发生。无论我是否使用图像验证器类,uploadedImage
函数的UploadedImageToByteArray
参数似乎包含相同的值,但它在两种情况下都返回不同的结果 - 一个有效的字节数组当我使用它时不使用图像验证器和空字节数组时的图像。
答案 0 :(得分:1)
您需要回放InputStream:
private bool IsFileTypeValid(HttpPostedFileBase image)
{
try
{
using (var img = Image.FromStream(image.InputStream))
{
return IsOneOfValidFormats(img.RawFormat);
}
}
finally
{
image.InputStream.Seek(0, SeekOrigin.Begin);
}
}