2017-07-01 41 views
0

我們的項目中有一個來自客戶端的文件具有相同的文件名,有時也具有相同的文件大小。目前,當我們上傳文件時,我們正在檢查數據庫中現有文件的新文件名,如果有參考文件,我們將其標記爲重複文件,並且根本不允許上傳。但是現在我們有要求在文件名相同時檢查文件的內容。所以我們需要找出一個解決方案,根據內容區分這些文件。那麼,我們如何有效地做到這一點 - 意味着如何做到這一點,以避免一分鐘的錯誤機會?唯一標識具有相同名稱和大小但具有不同內容的文件

的Rails 3.1的Ruby 1.9.3

下面是一個選項,我已經從一個Web引用讀取。

require 'digest' 
digest_value = Digest::MD5.base64digest(File.read(file_path)) 

而上述行將讀取傳入文件的所有內容,並根據它將生成一個唯一的散列,對不對?然後我們可以使用它來進行獨特的文件識別。但我們有超過500名用戶同時以24/7模式工作,其中大多數用戶將會進行此操作。因此,如果傳入文件的大小很大(大於25MB),那麼摘要將花費更多時間來讀取整個內容,並因此遇到性能問題。那麼,考慮到所有這些事實,更好的解決方案是什麼呢?

+0

爲什麼不給每個上傳的文件一個唯一的生成的ID,而與它的名稱,類型或內容無關? –

+0

@maxpleaner:隨機ID?我們還必須根據內容找出重複內容。現在,如果一個文件具有相同的名稱,我們說它是重複的。但是可能會出現file_name,甚至file_size都可能相同的情況。因此,我們需要根據內容唯一標識文件,然後如果相同,請輸入消息「文件重複」。 –

回答

3

我已閱讀問題和意見,我不得不說你有問題說不是100%正確的。看起來你需要的是識別相同的內容。期。儘管名稱和大小是否相等。如果我錯了,請糾正我的錯誤,但您可能不希望允許用戶更新100個同一文件的副本,因爲用戶在本地有100份副本,名稱不同。

到目前爲止,這麼好。我會用下面的方法。無論如何,文件名都沒有涉及。文件大小可能有助於快速檢查唯一性(大小不同,因此文件是完全不同的)。

然後,可以允許上傳時立即顯示「OK」響應。之後,後臺服務器應運行Digest::MD5,將文件與所有已上傳的文件進行比較。如果有重複,則應刪除該文件的新副本,,但名稱應保留在文件系統上,作爲原始的符號鏈接。

這樣你就不會挫敗用戶,讓他們能夠在不同的名字下擁有儘可能多的文件副本,同時將硬盤容量保持在儘可能低的水平。

+0

謝謝你的見解。用你認爲我的問題的方式,我認爲你的答案似乎非常有效!但是,讓我詳細解釋給你。用戶一次上傳單個文件,我們需要使用現有文件(數據庫)驗證新文件。只有在文件名稱相似時才檢查內容,如果文件名稱相似,我們可以檢查其大小以區分它。但與規模相比,內容檢查將更加準確。我根本不想上傳重複文件。另外,如果2個文件具有不同的名稱,我們不需要檢查內容。 –

相關問題