2012-06-08 42 views
1

我有一些簡單的實體,現在需要有一個配置文件圖像。什麼是正確的方法來做到這一點?所以,這是一對一的關係,一個圖像只與一個實體相關,反之亦然。該圖像應該通過webform與插入相關實體一起上傳。保存圖像到數據庫

如果任何人都可以指出我正確的方向如何堅持圖像到數據庫和相關的實體將是偉大的。

+1

請參見[通過ASP.Net MVC從SQL Server下載和上傳圖像](http://rusanu.com/2010/12/28/download-and-upload-images-from-sql-server-with-asp- net-mvc /) –

+0

爲什麼這個問題已經被投票了? 當我投反對票的問題時,我發表了一條評論,解釋了爲什麼... –

回答

4

就在方評論:我覺得是不是存儲在數據庫圖像是一個好主意。

一般來說,在db中存儲圖像並不是一個好主意,因爲dbs旨在存儲文本不是大的二進制塊。爲圖像存儲路徑並將圖像放在文件夾中好得多。如果你想確定1到1的關係名稱圖像與實體的ID(1323.jpg)。

如果你想有圖像路徑應遵循的一些準則(在通用代碼防守):

  • 在圖像的上傳檢查圖像是有效的(甚至使圖像頭的二進制校驗)
  • 如果插入新實體,則不允許覆蓋現有圖像。
  • 作爲主鍵的名稱圖像(1.jpg,2.jpg)
  • 在圖像加載時,不要假設圖像會在那裏。
  • 不允許(如果可能的話)與圖像進行手動交互(無需在機器上進行遠程操作並將圖像從一個地方複製到另一個地方)。手動交互可能會導致不一致。

但我認爲,出於某種原因,你應該這樣做。 因此,爲了實現你想要的:

DB設計

  • 在表中創建一個二進制列(binary或varbinary)
  • 是,如果你創建更好的不同與1-1關係的表。然而,這個想法是避免在保溼實體時加載圖像。只有在需要時才使用延遲加載方式加載圖像。
  • 當你做出一個大的選擇時,你必須避免加載圖像(例如,如果你想加載一個組合中的所有實體,避免使用SELECT *),因爲它會將無數圖像加載數千。正如我所說的,這可以通過在不同的表中創建圖像,或者只在SELECT中加載適當的列或通過延遲加載來完成。 (或甚至沒有在DB的圖像,只有路徑更好)

C#代碼

+1

好吧,我決定按照你的意見將圖像存儲在文件系統中。聽起來更好的主意。我認爲我需要創建另一個實體照片與id,名稱,路徑,desc,參考相關實體?任何鏈接請或建議。 – panjo

+0

我要編輯我的答案,給你一些建議。 順便說一句我不明白爲什麼有些人downvoted你的問題... –

+0

我張貼另一個問題,將圖像存儲到文件系統http://stackoverflow.com/questions/10946789/saving-image-to-the-filesystem-使用-MVC3 – panjo

1

的代碼是微不足道的,但爲什麼DB? 如果這是一個網站,爲什麼不把它保存到磁盤上可以輕鬆引用它的位置呢?

數據庫進行了優化,以存儲已知大小和相對較小的數據。你的圖片最有可能會超過8KB(假設它是MAX數據類型)。 圖像將存儲在您的「配置文件」的獨立行/頁面中。

就我個人而言,我會將圖像保存在已知文件夾中,並使用圖像名稱的id。對於沒有圖像並使用標準gif或類似文件的配置文件,可能通過將配置文件id的simlinks/hardlinks添加到常用gif來簡化/修剪。

public class Profile 
{ 
    public int Id {get;} 
    public string Name {get; private set;} 
    public Image Picture {get; private set;} 

    public void Save() 
    { 
     using (var connection = new SqlConnection("myconnectionstring")) 
     using (var command = new SqlCommand("", connection)) 
     { 
      command.CommandText = 
       "UPDATE dbo.TblProfile " + 
       "SET " + 
        "Name = @name, " + 
        "Picture = @picture " + 
       "WHERE ID = @id"; 
      command.Parameters.AddWithValue("@name", Name); 
      command.Parameters.AddWithValue("@picture", Picture); 
      command.Parameters.AddWithValue("@id", Id); 
      command.ExecuteNonQuery(); 
     } 
    } 
}