2009-02-21 51 views
2

該平臺並不像理論那麼重要。爲了記錄,它是ASP.NET(3.5 SP1上的C#),SQL Server 2005.爲了說明起見,我有無限的空間(文件系統和數據庫)和無限帶寬。爲多個用戶存儲圖像

我正在研究一個項目,該項目允許多個用戶上傳自己的圖像,該圖像可以由該用戶管理並由所有用戶查看。我試圖確定什麼是最好的存儲機制。我的思路是,我想避免直接將它們存儲在數據庫中,儘管我可以看到存儲有關圖像的信息。

我看到的是用戶會上傳圖片。服務器將爲圖像創建一個唯一的名稱,將其存儲到文件系統,並將關於該圖像的關係數據存儲在數據庫中(即上傳時,與用戶的關聯,對標題的引用等)。將它們放在磁盤上是未來能夠轉向CDN的一個步驟。

有沒有人使用過這種方法或可以推薦一種不同的方法?是否應該有某種文件夾結構,例如每個用戶的文件夾以幫助文件訪問時間?

任何反饋將不勝感激!

回答

1

我認爲你已經在正確的軌道上,據推薦做法:存儲數據在數據庫中上傳的文件,如文件系統的位置,文件名,屬性,標題等,但存儲實際文件在爲此目的明確指定的指定文件夾中。

此方法還允許您檢查上傳文件的格式限制,並在完成上載過程之前對其進行病毒掃描。

絕對不推薦在數據庫中存儲二進制內容(如圖像),這種看法似乎非常普遍。

+0

謝謝。我曾經在數據庫中存儲圖像,因爲「其他人都在這樣做」的思想,但它不再有意義。我甚至沒有想過病毒掃描,但是,也沒有。 – 2009-02-21 14:53:30

+0

最受歡迎!很高興我能協助。 ;-) – Cerebrus 2009-02-21 17:38:21

1

我認爲你應該考慮的是引用PresentationBase.dll,它會讓你訪問由Windows Presentation Foundation包裝的Windows圖像組件(WIC)。即使這是一個ASP.NET項目,您也可以依靠這些類來進行圖像編碼和解碼。這些類值得使用二進制數據或流,並且可以解碼和編碼幾種流行的圖像格式,並通過不同的解碼和編碼,高度和寬度,從高分辨率存儲中快速生成縮略圖。

這些類位於System.Windows.Media.Imaging命名空間中,並從BitmapEncoder或BitmapDecoder派生。還有其他幾個第三方實現,如果您使用這些類,您可以從中受益。

+0

謝謝你,約翰!我還沒有用WPF做過很多,所以這聽起來像是一個很好的方式讓我的腳溼潤。 :-) – 2009-02-21 14:44:15

3

我同意將圖像/文件存儲在文件系統而不是數據庫是一種好方法。

關於文件訪問時間,如果目錄包含大量文件,您可能需要檢查文件系統的行爲。如果這是一個巨大的列表,某些文件系統可能會降低性能。如果是這樣,你可能想創建一些文件夾結構,例如從00-FF開始,這可能在幾個層次上,具體取決於您期望的文件數量。然後你可以使用某些字段(如文件名)的MD5散列將其排序到正確的目錄(例如,散列FABE063E ...進入FA/BE /文件名)。

如果你不想讓文件名被猜測以限制訪問,你也可以使用一些散列或甚至隨機字符串作爲文件名。這樣,只有知道文件名的用戶才能訪問此文件(例如,通過您提供的鏈接)。如果您想轉移到最終無法自行檢查權限的CDN,這可能也很重要。

(如果權限是不重要的,OTOH要猜測的文件名,你顯然走另一條路,也許使用用戶名作爲文件夾結構等)