2010-10-22 55 views
0

我試圖改變我們處理上傳文件的方式,然後將它們存儲到磁盤。當來自非Windows操作系統的用戶上傳帶有windows文件名中非法字符的文件時,我們遇到了一些問題。架構:在哪裏清理上傳的文件名?

  1. 我的理想主義者告訴我,文件名應儘可能靠近網絡層合法。因此,我們在業務邏輯和數據層中使用相同的正確文件名。 實際上,這要求我們主動清理幾個地方的文件名,然後再信任它。這是一個問題,因爲它更容易出現程序員錯誤,除非您只有一個來自Web的文件入口點。

  2. 我看到的另一個選擇是使用衛生方法在文件名上包裝文件IO。這是不可能的,因爲我們有時需要將文件名存儲在數據庫中。如果文件名在存儲到磁盤之前未更改,則數據庫將包含錯誤的文件名。如果對文件系統的所有調用都通過相同的文件名衛生方法,則這並不重要,但實際上操作部門會想通過從DB讀取文件名來執行一些腳本作業來移動文件。

解決方案2的一種方法是,如果它被衛生改變,則返回新的文件名。這要求方法的用戶知道這一點並正確處理它。像這樣:

public static FileStream CreateFile(string filename, out string newFileName) 
{ 
    newFileName = FileNameSanitiser.GetSanitisedFullPath(filename); 
    return System.IO.File.Create(newFileName); 
} 

關於選項1,我們應該只有一個或兩個文件上傳端點。這將使這個選項更加可行。我認爲這可能值得投入時間,但我不確定我的經理是否同意...

回答

1

如果上傳文件(以及大概是重新下載文件)只能通過您的網站界面,您可以使用GUID(或其他獨特實體)重命名每個文件,然後將新名稱和舊名稱存儲在數據庫中。

或者,您可以將文件內容存儲在數據庫本身中,這將完全避免Windows文件命名限制。請注意,這不一定是您想要做的事情 - 這兩種文件存儲方法(即磁盤和數據庫)都有優點和缺點。

1

我們的工作非常簡單 - 任何上傳的文件都會使用系統生成的名稱(我們使用GUID)保存在FileSystem中,然後數據庫表存儲生成的名稱和實際名稱。所以UI將顯示下載鏈接的實際名稱,實際的下載處理程序將在響應頭中使用相同的名稱。

+0

這將是我的確切答案。 – 2010-10-22 13:37:02

+0

這不是一個壞的解決方案。唯一的問題是,我們有一個現有的系統,這個系統相當大,而且已經有很多文件。切換到這個解決方案將是一個重大變化。 – Polymorphix 2010-10-22 13:41:50

+0

此外,我認爲保持文件名稱爲「人類可讀」可能會有用,以防萬一出現任何錯誤,並且磁盤上的文件與DB文件名稱之間的連接應該丟失/損壞。 – Polymorphix 2010-10-22 13:44:07