手頭問題:以下代碼有時會拋出System.ArgumentException: Illegal characters in path
。正確處理上傳文件名稱的方式
var fileName = Path.GetFileName(Request.Files[0].FileName);
文件是由各種最終用戶上傳的,所以我不能假裝這種情況是無效的並忽略它。
UserAgent
失敗的上傳請求通常指向Mac系統。而且,當我打擾調查時,非法角色是0-32範圍內的一些控制角色。
GetFileName()
呼叫當然是需要的,因爲有時HttpPostedFile.FileName
只包含文件的名稱,有時在用戶的機器上包含完整路徑。我可以做一些傻事
var fileName = Request.Files[0].FileName;
foreach (var c in Path.GetInvalidPathChars())
fileName = fileName.Replace(c, '_');
fileName = Path.GetFileName(fileName);
但它只是感覺不對。
是否沒有標準的「網絡」方式處理上傳的文件名?我很難接受我是第一個遇到這個問題的人。
============================================== ====================
爲了避免進一步的混淆。提取的文件名是而不是用於存儲磁盤上的文件,並且不必在託管環境的上下文中有效。它只需要顯示回給用戶。
我相信標準的方法是在服務器上生成一個與其他用戶上傳文件不衝突的文件名。 – dtb 2011-12-19 14:33:18
通常不是一個標準,但我會說什麼更建議比什麼不是。例如用數字1,2,3等起始名稱也要記住,你應該知道文件可以處理或不處理關於命名文件的事情。我將創建一個Validation類並檢查字符'!,@, #,$,%,^,&,*,(,),+,=,{,},[,]你會得到這個想法..創建一個無效的字符或字符串,只允許「_」或「 - '和第一個字符之後的數字......你有什麼東西在頂部是好的,但你只是檢查'_'下劃線所有其他命名約定將通過 – MethodMan 2011-12-19 14:36:22
@dtb文件存儲在磁盤上, Guid.NewGuid()的ToString( 「N」)'。仍然需要向用戶提供原始名稱,我需要以某種方式進行解析。 – 2011-12-19 14:36:24