2008-09-17 82 views
0

我將託管用戶提交的文件。我需要從文件中獲取一些數據,然後將其移至某個目錄。網絡託管網站的文件存儲策略

這個文件的生命週期有兩個關注點。第一個是抽象數據的時候,第二個是文件被歸檔的時候可以共享。

當數據被抽象化時,我認爲將文件重命名爲獨特的或將一個唯一的字符串追加到文件名以防止覆蓋其他現有文件。

當文件要存檔時,我想到了三種策略。一種是將從某個數據上傳的所有文件保存在一個文件夾中。 (2006/sept/04,2008/jan/05)另一個是保留一個文件夾,並保持填充它,直到文件夾中要保留的最大文件數量,然後創建另一個文件夾(/ folder001 /,/ folder002// folder003 /等)。另一個是創建子文件夾,一旦達到某個閾值。所以像(/ j/jd/jde/jdelator)我在unix中看到過這個不知道該如何解釋。

我有什麼問題是你們認爲有用或使用哪種策略?

回答

3

當數據被抽象化時,我會選擇類似於:filename + millisec(); 對millisec的兩次調用不可能是相同的,並且文件名在訪問時更易於用戶友好。

如果您決定刪除舊的和未使用的文件,則日期策略可能很方便:根據您的日誌,您只需獲取2006文件夾,並刪除去年未訪問過的所有文件。 這對用戶來說也是一個很好的指示,因爲他們會知道它是否是新鮮的文件。 folderXYZ只是這個的一個變體,用每個N個文件的標籤替換日期。

閾值子文件夾可幫助您保持較低的目錄條目數量,因此訪問速度更快。請注意,此解決方案需要在特定目錄增長時有時移動文件(如果未映射,則會中斷一些url)。

另一種可能性是使用UID對應於文件名位置的DB,並通過http://server.com/UID/filename.txt訪問文件。 這樣,用戶將文件保存爲「文件名」。txt「,這對他很方便,並且你知道在哪裏可以找到該文件(使用DB將UID轉換爲位置) 請注意,UID可以是校驗和(MD5,SHA-1)來處理重複的同一個文件。

1

我已經使用了一個關係數據庫,它將ID(int)標記爲uuids,它是文件的名稱。這樣,它們如何在磁盤上並不重要。它可以幫助我混淆文件。另外,我可以使用JOIN來任意「重命名」文件。另外,我可以使用不同的文件「名稱」。這一切都取決於您的應用程序以及它的運行位置。

1

雖然這取決於您的應用程序等,但我建議現在保留文件存儲庫方案非常簡單,並在稍後決定更詳細的策略。換句話說,你會在一段時間內形成一種「有組織的混亂」;結構和戰略將在稍後提出,屆時您將瞭解所有要求和領域細節。通過保持簡單,你可以輕鬆地改變一切。

無論如何,變化是不可避免的,你現在可以做的最好的事情是選擇一些策略並記錄一切。

2

我會在數據庫中使用guid投票,然後使用Content-Disposition頭將其命名回原文件名(如有必要)。我主張的一件事是你使用的文件夾存儲在Web根目錄之外;您不希望用戶將文件上傳到應用程序文件夾中。