2011-10-28 98 views
7

我正在開發一個允許用戶上傳文件(圖片和其他文件)的網站。我在這方面沒有任何經驗,希望能夠通過正確的方式來存儲和索引這些文件。在網絡服務器上存儲用戶上傳的文件

雖然我想有一個很好地擴展到大容量數據的架構,我目前沒有擔心極高(facebook-,谷歌規模的)卷。

我在

/files/{username}/ 

思維存儲在文件系統中的文件,然後有一個數據庫uploads每個用戶都有自己的表,每個文件的他已經上傳的文件名(因此URL)的(以及我可能想要存儲的任何其他額外信息)。 這樣的數據庫結束(給每個用戶他自己的表)似乎對我來說效率很低,但是在單個表中保存所有文件的記錄似乎並不正確,而且每次單個文件時都需要搜索整個表被訪問。

我的背後考慮給每個用戶自己的桌子,這是找給用戶一個文件時跨分片表中的數據,減少搜索時間整潔和獨特的方式推理。

回答

3

建議什麼Matt H是,如果你要實現的目標是每個用戶級圖像訪問一個好主意。但是,如果您的數據庫存儲空間有限,則以二進制數據存儲圖像的效率不高,如您所述。

對每個用戶使用一張表是不好的設計。上傳文件的用戶應該只是表中存儲所有文件上傳的字段/列,以及任何文件元數據。我建議爲文件名生成一個GUID,該GUID保證是唯一的,並且比自動增量字段更好,如果你試圖阻止用戶訪問所有圖像,這個字段很容易被猜出。

您關心的是性能,但是在您處理數百萬條記錄之前,您選擇圖像的查詢屬於某個用戶,在特定的時間範圍內上傳(例如,您正在存儲時間戳或類似內容)是微不足道的成本。如果速度有問題,您可以在用戶名上添加B樹索引,這將顯着加快用戶特定的圖像查詢速度。

回的安全性,訪問和組織的話題。將圖像存儲在每個用戶的文件夾中(儘管取決於用戶的數量,文件夾的數量可能增長到難以管理的水平)。如果您不希望圖像公開可用,請將它們存儲在非web文件夾中,讓您的應用程序讀取數據並對其進行流式處理以便爲用戶呈現圖像。更復雜的,但你從互聯網上隱藏實際的文件。另外,您將能夠驗證經過身份驗證的用戶對圖像的所有請求。

3

這取決於您的應用程序和數據庫的性質和結構。我已經使用了許多技術,包括存儲在通過認證網關訪問的數據庫一滴,關閉網絡文件夾基於文件夾,圖片...

對於外部圖像不直接相關的應用程序或數據庫,像臨時照片或其他東西,我傾向於把它們放在一個文件夾中。由於您的結構看起來像來自用戶的圖片,因此我預計可能會有與圖像關聯的元數據,例如標籤。在這種情況下,假設我有足夠的容量,我可能會將圖片存儲在數據庫表中。如果照片需要安全保護,其他用戶無法進行身份驗證,則數據庫將擁有自己的安全性,而基於文件的存儲需要某種技巧來防止未經授權的訪問。

我不會用每個用戶表,只是一個ID,用戶ID,圖片的blob的元素圖片的表。

這是否幫助?

+0

它確實有幫助。但是,有幾個問題。目前,我們使用的共享網絡服務器將每臺數據庫限制在1GB,因此將圖片/文件存儲爲數據庫本身並不可行。另外,不會讓一張桌子上的所有圖片都增加一張特定圖片的搜索時間?我每個用戶的表格背後的推理是,知道用戶,我會知道要搜索哪個表,並因此必須搜索較少的記錄(將其視爲基於用戶標識的分片)。這不合理嗎?有什麼我失蹤? – xbonez

+1

索引的大小影響SQL執行,但大量未編制索引的blob不會引起注意。但是如果你沒有空間,這是一個有爭議的問題。在這種情況下,您需要將它們存儲在文件系統中。一個userid/photos文件夾結構是好的,如果你有很多,因爲避免一個文件夾中的大文件計數是一個好習慣。我會放置一個.htaccess以避免直接訪問(假設您需要auth來訪問它們),並使用photo?id =無論如何將標題更改爲image/jpeg或其他內容,並且echo readfile的圖像。 –

相關問題