2014-11-01 14 views
0

所以我需要驗證我的應用程序中的圖片上傳。我正在使用一些我可能從這裏得到的代碼,並且發生了一些非常奇怪的事情。首先,我的驗證工作方式是使用流利的自定義驗證類。對於圖像驗證,我只驗證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似乎都包含相同的值,但它在兩種情況下都會返回不同的結果 - 當我不使用圖像時,圖像的有效字節數組圖像驗證器和一個空字節數組,當我使用它。

回答

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); 
     } 
    } 
+0

然後NotImplementedException發生。但是HttpPostFile類的流支持尋找,否則你需要將InputStream複製到一個MemoryStream中,並且你不得不根據MemmoryStream來驗證發佈的文件。 – 2014-11-01 13:17:01

+1

我的回答不對,因爲'CopyTo'讀取整個流,您仍然需要將流返回到起點。 – 2014-11-01 13:21:30

+0

這工作。我剛剛意識到我還有更多要了解內存和I/O。 – Alternatex 2014-11-01 13:27:50

相關問題