2012-05-14 90 views
1

將我的映像保存到數據庫的最佳比較方式是什麼不同,從而節省了I/O。在保存到數據庫之前比較字節數組

場景:

進出口使用實體框架寫入MVC3 ASP.NET應用程序。我有一個編輯我的UserProfile控制器的操作方法。現在我想檢查我發佈回該方法的圖像是不同的,如果是,那麼我想調用ObjectContext。 SaveChanges()如果它是相同的圖像,則繼續前進。

這裏是我的代碼砍下版本:在n要一個SQL Server Express的數據庫,這是在我的實體的字節數組引用

[HttpPost, ActionName("Edit")] 
    public ActionResult Edit(UserProfile userprofile, HttpPostedFileBase imageLoad2) 
    { 
     Medium profileImage = new Medium(); 

     if (ModelState.IsValid) 
     { 
      try 
      { 
       if (imageLoad2 != null) 
       { 
        if ((db.Media.Count(i => i.Unique_Key == userprofile.Unique_Key)) > 0) 
        { 
         profileImage = db.Media.SingleOrDefault(i => i.Unique_Key == userprofile.Unique_Key); 
         profileImage.Amend_Date = DateTime.Now; 
         profileImage.Source = Images.ImageToBinary(imageLoad2.InputStream); 
         profileImage.File_Size = imageLoad2.ContentLength; 
         profileImage.File_Name = imageLoad2.FileName; 
         profileImage.Content_Type = imageLoad2.ContentType; 
         profileImage.Height = Images.FromStreamHeight(imageLoad2.InputStream); 
         profileImage.Width = Images.FromStreamWidth(imageLoad2.InputStream); 

         db.ObjectStateManager.ChangeObjectState(profileImage, EntityState.Modified); 
         db.SaveChanges(); 

        } 
       } 
      } 
     } 

所以我救我的圖像作爲VARBINARY(最大值) 。

它只是一個循環來自帖子中的字節數組並將其與將字節數組拉回到ObjectContext中的情況進行比較的情況?

回答

3

而不是直接比較字節數組,我會比較圖像的散列。也許像下面的東西可以提取到比較方法:

SHA256Managed sha = new SHA256Managed(); 
byte[] imgHash1 = sha.ComputeHash(imgBytes1); 
byte[] imgHash2 = sha.ComputeHash(imgBytes2); 

// compare the hashes 
for (int i = 0; i < imgHash1.Length && i < imgHash2.Length; i++) 
{ 
    //found a non-match, exit the loop 
    if (!(imgHash1[i] == imgHash2[i])) 
     return false; 
} 
return true; 
+0

謝謝傑西 - 我會給這個去! :P – garfbradaz

+1

Enumerable.SequenceEqual http://msdn.microsoft.com/library/system.linq.enumerable.sequenceequal.aspx – takepara