2012-03-08 76 views
0

我有一個asp:FileUpload控件將圖像上傳到本地的服務器。如何確保服務器上的文件沒有被同名文件覆蓋

它運行良好,但我決定測試如果用戶上傳與服務器上的現有映像具有相同文件名的映像,會發生什麼情況。結果是原始圖像被新圖像覆蓋。

我想寫一些代碼,如果相應的文件已經存在,將在文件名的末尾附加一個數字,但是我相信這有點有缺陷,因爲用戶仍然可以提供文件名附加一個數字,因此仍然覆蓋。

什麼是解決此問題的最佳方法?

回答

1

您可以使用Globally Unique IDentifier來確保每個文件名都是唯一的。如果你想保留原始文件名,你可以用一個GUID作爲前綴。

if (File.Exists(fileName)) 
{ 
    fileName = Guid.NewGuid() + fileName; 
} 
+0

正是我在找什麼。謝謝! – 2012-03-08 14:14:00

0

因爲總是有重複的文件名的機會,假設你有跟蹤用戶最初選擇我只想用一個保證是唯一的一個名稱的文件名(即一個GUID或一些主鍵),並跟蹤服務器分配的文件名與數據庫中用戶指定的文件名之間的映射。

或者,如果您不必追蹤原始文件名添加數字(或「副本」)也將工作 - 如果添加的數字已存在的文件名,只需添加另一個數字,所以上。這就是Windows在將文件複製到相同文件夾時默認執行的操作。

1

在您的數據庫中存儲fileNamefriendlyFileName字段。跟蹤後一字段中的原始文件名以用於顯示目的,並在前者中存儲GUID(請參見.NET的Guid結構)。

然後,顯然使用唯一標識符來命名上傳產生的物理文件。

根據大小,性質,訪問速度以及不同,您可以將這些文件作爲二進制文件存儲在數據庫本身中 - 無論這是不是一個好主意,本身就是一場辯論 - 至少有一個優點這樣做是這樣一個「獨立」系統的組織。

1

簡單的回答:不要依賴用戶提供正確的名稱。

您應該爲剛上傳的文件創建一個唯一的文件名,然後將該文件保存在表中以便日後可以參考。

例如:

用戶上傳了一個名爲foo.file文件。當文件被上傳你爲它創建一個唯一的文件名,並在數據庫表中存儲的用戶名,所以在表中的行會看起來像:

file_id | file_name | file_rname 
1    39189f9381  foo.file 

這樣,您就不必擔心文件被覆蓋,但你仍然可以呈現用戶選擇的文件名,所以不會有任何混淆。

希望這可以幫助

相關問題