我試圖改變我們處理上傳文件的方式,然後將它們存儲到磁盤。當來自非Windows操作系統的用戶上傳帶有windows文件名中非法字符的文件時,我們遇到了一些問題。架構:在哪裏清理上傳的文件名?
我的理想主義者告訴我,文件名應儘可能靠近網絡層合法。因此,我們在業務邏輯和數據層中使用相同的正確文件名。 實際上,這要求我們主動清理幾個地方的文件名,然後再信任它。這是一個問題,因爲它更容易出現程序員錯誤,除非您只有一個來自Web的文件入口點。
我看到的另一個選擇是使用衛生方法在文件名上包裝文件IO。這是不可能的,因爲我們有時需要將文件名存儲在數據庫中。如果文件名在存儲到磁盤之前未更改,則數據庫將包含錯誤的文件名。如果對文件系統的所有調用都通過相同的文件名衛生方法,則這並不重要,但實際上操作部門會想通過從DB讀取文件名來執行一些腳本作業來移動文件。
解決方案2的一種方法是,如果它被衛生改變,則返回新的文件名。這要求方法的用戶知道這一點並正確處理它。像這樣:
public static FileStream CreateFile(string filename, out string newFileName)
{
newFileName = FileNameSanitiser.GetSanitisedFullPath(filename);
return System.IO.File.Create(newFileName);
}
關於選項1,我們應該只有一個或兩個文件上傳端點。這將使這個選項更加可行。我認爲這可能值得投入時間,但我不確定我的經理是否同意...
這將是我的確切答案。 – 2010-10-22 13:37:02
這不是一個壞的解決方案。唯一的問題是,我們有一個現有的系統,這個系統相當大,而且已經有很多文件。切換到這個解決方案將是一個重大變化。 – Polymorphix 2010-10-22 13:41:50
此外,我認爲保持文件名稱爲「人類可讀」可能會有用,以防萬一出現任何錯誤,並且磁盤上的文件與DB文件名稱之間的連接應該丟失/損壞。 – Polymorphix 2010-10-22 13:44:07