2012-09-12 170 views
0

我有一個Rails中的Web應用程序,作爲AJAX文件上傳功能。文件被上傳到遠程服務器(AWS S3)。我目前的策略是上傳temp/目錄中的文件(使用原始名稱),直到用戶提交表單,然後將其重命名爲其確定名稱。避免文件上傳命名衝突的策略

但問題是,如果多個用戶試圖同時上傳兩個具有相同名稱的文件,那麼其中一個會覆蓋另一個。

我想要解決這個問題的策略是在加載上傳頁面時生成隨機SHA1,將它們存儲在本地表中以確保它們是唯一的,並在臨時文件重命名時將其刪除。

您是否看到這種方法存在問題?

解決此問題的最佳策略是什麼?

+1

爲什麼SHA1不只是一個GUID或'mktempfile'生成器?對內容使用SHA1的原因是,如果預計重複資源被添加*並且*它被用作重複控制的方法*並且*資源在上載後被認爲是不可變的。但是,如果情況並非如此..(然後想象兩個人同時上傳兩個空文件的位置)。 – 2012-09-12 00:32:17

回答

0

一個問題是,如果他們離開頁面而不上傳任何東西,他們的哈希將留在數據庫中,並最終弄得一團糟。我會避免將任何臨時存儲在數據庫中的東西。

與其試圖想出自己的方式來命名臨時文件,爲什麼不使用ruby tempfile library,這會爲您做到這一點?


最初,我以爲你是上傳文件到紅寶石服務器,並上傳到s3自己。如果用戶直接上傳文件,Tempfiles將無法幫助您。如果您只需要臨時文件的唯一名稱,則UUID生成器可能適用於您。有一個Ruby UUID generator gem這是設計不產生重複,即使在分佈式設置。如果您使用這些文件命名文件,則不需要在數據庫中存儲任何內容。

+0

無論如何,這種清理需要在所有情況下處理(即使是臨時文件),這是一項簡單的維護工作。 – 2012-09-12 00:36:46

+0

問題是文件沒有上傳到我的本地服務器,而是上傳到AWS S3,所以我無法控制它。我已經有一個cronjob用於清理超過24小時的臨時文件,我可以很容易地從數據庫中同時刪除舊條目。 – nbarraille

+0

您的用戶是否必須登錄才能上傳文件,或者任何人都可以上傳? – kjw0188