2009-08-07 81 views
1

實施以下場景的最佳方法是什麼: 該網站要求存儲私人和公共圖片的圖片庫。我聽說你可以將它們存儲在文件層次結構或數據庫中。在文件層次結構設置中,如何防止直接訪問圖像。在數據庫設置中,只能通過網頁視圖訪問圖像。什麼是有效的解決方案?ASP.NET圖片上傳架構

[編輯]謝謝大家的回覆。我決定數據庫路由是這個應用程序的最佳選擇,因爲我沒有直接訪問服務器。侷限於一個webroot文件夾。所有的答覆都非常感謝。

+0

您使用的數據庫是? – RichardOD 2009-08-07 20:29:44

回答

2

使用這兩種方法我會說數據庫。如果你將它們存儲在文件存儲上並且需要保護,那麼你必須將它們存儲在web-root之外,然後使用處理程序(如John提到的)來檢索它們。這是容易寫一個處理程序,以串流從數據庫的直接,你會得到一些好處:

  • 有了數據庫,您不必擔心文件存儲權限或生成唯一的文件名或文件夾層次結構等
  • 使用數據庫,您可以輕鬆地直接應用權限和保護 - 不會試圖弄清楚誰可以查看基於路徑的內容等。
  • 與數據庫可以存儲圖像和元數據都在一起 - 當你刪除您刪除的圖像元數據 - 但沒有孤立的記錄,你從數據庫中刪除的可能性不是從文件存儲
  • 更容易備份數據庫圖像,然後恢復

缺點是性能,但你可以使用緩存等來幫助。您還可以使用FILESTREAM storeage in SQL Server 2008,這意味着你的文件系統的性能,但通過DB(05):

「FILESTREAM 系統通過存儲的varbinary(最大值)集成了一個NTFS文件在SQL Server 數據庫引擎 二進制大對象(BLOB)數據作爲文件系統上 文件。的Transact-SQL 語句可以插入,更新,查詢, 搜索和備份FILESTREAM數據。 Win32文件系統接口提供 流對數據的訪問。

FILESTREA M使用NT系統緩存 來緩存文件數據。這有助於減少FILESTREAM數據 對數據庫引擎 性能可能產生的影響。 SQL Server緩衝區 未使用池;因此,這 內存可供查詢 處理。」

1

實際上這兩種情況都非常相似,所以取決於您...數據庫並非設計用於提供文件,但如果大小不是您真正關心的問題,我不會看到任何問題正在做。

要回答你關於直接訪問的問題,你應該像設置數據庫一樣設置文件映像:你會使用某種類型的頁面(可能是一個.ashx處理程序)來提供這些圖像,允許你用戶和圖像之間的一層邏輯,以確定他們是否應該訪問它。然後,圖像所在的實際目錄將需要a)不是IIS中目錄結構的一部分,或者b)如果它是IIS的一部分,則只允許Windows身份驗證訪問,並且只允許應用程序進程運行的帳戶在訪問目錄下。

+0

但是,如果您處於負載平衡的環境中,則需要將服務器指定爲資源服務器,或者在服務器之間創建某種重複機制。 – andrewWinn 2009-08-07 20:20:03

2

使用文件層次結構,可以將文件放到網站文件夾中,例如,假設web文件夾是c:/ inetpub/wwwroot/somesite,將文件放在c:/ images /下,這樣網絡用戶將無法訪問圖像文件。但是你不能在你的網站中使用直接鏈接,你需要創建一些程序來讀取文件,返回流。

個人我認爲最好將文件放入數據庫中,仍然創建一些程序來檢索二進制圖像數據並返回到所需的任何位置。

+0

我打算爲這個評論投票,直到你說你認爲把文件放在數據庫中更好: - 如果你的數據庫中存有大量的圖片,它會導致嚴重的性能問題。 – andrewWinn 2009-08-07 20:19:04

+1

我知道有一個限制。但根據我自己的經驗,sql服務器處理它相當好...... :-) – Fred 2009-08-07 20:26:51

+0

Andrew,請參閱我的評論re:FILESTREAM存儲 - 解決性能問題 – 2009-08-07 20:33:20

0

如果您使用的是IIS7,由於.NET早期在管道中跳轉,我相信您也可以保護jpg文件,只需使用角色管理器並將角色應用於文件系統文件夾即可。如果你使用的是IIS6,我已經做了類似於John的答案,我在那裏存儲了wwwroot之外的實際文件,並使用一個處理程序來決定用戶是否有正確的憑據來查看圖像。

我會避免數據庫,除非你有很強的理由這樣做 - 我不認爲照片庫是其中之一。

0

無論是亞馬遜S3提供了一個非常簡單的API接受上傳。您可以使用SimpleDB的或你的SQL數據庫來追蹤URL和權限。將整個S3鬥私,並使用ASP.NET服務器上的AWS密鑰來鑑別它。

很少的代碼需要上傳到S3,很少更將需要在SQL執行bookeeping。

一旦他們進入S3,抓住image resizer libraryS3 Reader plugin和y你可以讓你的整個系統在一個小時內運行。而且 - 它會正確縮放。沒有磁盤或數據庫空間限制。永遠。

您可以使用Image Resizer庫的AuthorizeImage事件來實施授權。如果當前用戶不允許訪問,只需拋出AccessDeniedException。

如果您想調整性能,請添加DiskCache和CloudFront插件。 CloudFront可以低成本地緩存公共映像,並且DiskCache將處理私有映像,以靜態文件速度提供服務。