我想在Ruby on Rails中創建一個簡單的文件存儲庫。用戶擁有自己的帳戶,登錄後可以上傳文件或下載先前上傳的文件。Ruby on Rails中的文件存儲庫
這裏的問題是安全性。文件應該是安全的,除了業主以外的任何人都無法使用。
- 哪裏,我應該在哪個文件夾中存儲文件,以使它們儘可能安全?
- 重新命名上傳的文件,將名稱存儲在數據庫中並在需要時恢復它們是否有意義?這可能有助於避免名稱衝突,但我不確定這是否是一個好主意。
- 文件是否應該全部存儲在一個文件夾中,還是應該有所分割?
我想在Ruby on Rails中創建一個簡單的文件存儲庫。用戶擁有自己的帳戶,登錄後可以上傳文件或下載先前上傳的文件。Ruby on Rails中的文件存儲庫
這裏的問題是安全性。文件應該是安全的,除了業主以外的任何人都無法使用。
對於簡單的情況下(在您不希望分發的文件存儲):
商店中tmp
目錄中的文件。請勿將它們存儲在public
中。然後只通過一個路由和控制器來進行身份驗證/授權檢查。
我看不到任何理由重命名文件;您可以根據用戶標識將它們分成子目錄。但是,如果您想允許上傳具有相同名稱的文件,那麼您可能需要爲每個文件的名稱生成一個唯一的哈希值或其他值。
見上。您可以按照您認爲合適的方式對其進行分區。但我肯定會建議對它們進行分區,而不是將它們集中在一個目錄中。
我不確定我會用'tmp'。我會創建一個單獨的分區,最好安裝在一個單獨的驅動器上,因此可以輕鬆擴展。 'tmp'用於臨時存儲。 – 2011-06-04 21:00:57
這是一個有趣的問題。根據安全級別要應用我想提出以下建議:
選擇一個文件夾只有通過你的應用服務器進行訪問(如果您選擇在FS存儲)
我總是建議將文件重命名爲隨機生成的哈希(或者像URL短縮中使用的漸進生成的名稱,請參閱rubyurl的開源實現)。但是,我不會將它們存儲在數據庫中,因爲文件系統是爲處理文件而構建的,因此請讓它完成這項工作。您應該將元數據存儲在數據庫中,以便能夠在用戶下載文件時設置正確的文件名。
您應該在多個文件夾之間對文件進行分區。這給你多重優勢。首先,文件系統不是用來處理單個文件夾中的數百萬個文件的。如果您的操作嘗試從文件夾中獲取所有文件,則需要更多時間。如果您對原始文件名稱進行了模糊處理,則可以爲文件名中的每個字母創建一個目錄,並且每個目錄將獲得相當好的分佈數量的文件。
要考慮的最後一件事是可能的文件名衝突。用戶不應該能夠猜測來自另一個用戶的文件名。所以你可能在這裏需要一些額外的檢查。
根據您希望實現的安全級別,您可以應用越來越多的模式。
只是不要將文件保存在公用文件夾中,並創建一個將發送文件的控制器。
如何從這一點開始組織起來就是您的選擇。您可以爲每個用戶創建一個子文件夾。沒有必要從安全角度重新命名,但是嘗試清理文件名,空格和非ASCII字符會讓事情變得更加困難。
聽起來像體驗的聲音。 :-) – 2011-06-04 20:56:28
我也會添加它可能有助於清理文件名。不幸的是文件名並不是所有操作系統都普遍接受的。 – 2011-06-04 21:05:01