所以我需要驗證我的應用程序中的圖片上傳。我正在使用一些我可能從這裏得到的代碼,並且發生了一些非常奇怪的事情。首先,我的驗證工作方式是使用流利的自定義驗證類。對於圖像驗證,我只驗證HttpPostedFileBase
字段,然後在將其保存到我的數據庫中之前,使用一個輔助函數將其轉換爲字節數組。現在奇怪的部分..我的圖片驗證程序以某種方式影響我的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
函數的問題。
編輯:
好的,甚至更奇怪的事情正在發生。無論我是否使用圖像驗證程序類,UploadedImageToByteArray
函數的參數uploadedImage
似乎都包含相同的值,但它在兩種情況下都會返回不同的結果 - 當我不使用圖像時,圖像的有效字節數組圖像驗證器和一個空字節數組,當我使用它。
然後NotImplementedException發生。但是HttpPostFile類的流支持尋找,否則你需要將InputStream複製到一個MemoryStream中,並且你不得不根據MemmoryStream來驗證發佈的文件。 – 2014-11-01 13:17:01
我的回答不對,因爲'CopyTo'讀取整個流,您仍然需要將流返回到起點。 – 2014-11-01 13:21:30
這工作。我剛剛意識到我還有更多要了解內存和I/O。 – Alternatex 2014-11-01 13:27:50