2011-12-19 52 views
1

手頭問題:以下代碼有時會拋出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); 

但它只是感覺不對。

是否沒有標準的「網絡」方式處理上傳的文件名?我很難接受我是第一個遇到這個問題的人。

============================================== ====================

爲了避免進一步的混淆。提取的文件名是而不是用於存儲磁盤上的文件,並且不必在託管環境的上下文中有效。它只需要顯示回給用戶。

+0

我相信標準的方法是在服務器上生成一個與其他用戶上傳文件不衝突的文件名。 – dtb 2011-12-19 14:33:18

+0

通常不是一個標準,但我會說什麼更建議比什麼不是。例如用數字1,2,3等起始名稱也要記住,你應該知道文件可以處理或不處理關於命名文件的事情。我將創建一個Validation類並檢查字符'!,@, #,$,%,^,&,*,(,),+,=,{,},[,]你會得到這個想法..創建一個無效的字符或字符串,只允許「_」或「 - '和第一個字符之後的數字......你有什麼東西在頂部是好的,但你只是檢查'_'下劃線所有其他命名約定將通過 – MethodMan 2011-12-19 14:36:22

+0

@dtb文件存儲在磁盤上, Guid.NewGuid()的ToString( 「N」)'。仍然需要向用戶提供原始名稱,我需要以某種方式進行解析。 – 2011-12-19 14:36:24

回答

1

只是替換字符是不安全的。您應該驗證文件名並提示用戶在不支持時修復它(這是完全合法的,即使您的操作系統對文件名也有限制)。 否則,您可以:

  1. 如你所說,替換不支持字符(但你怎麼能保證你更換了所有可能的無效字符?)
  2. 編碼的文件名
+0

似乎不是一個可行的解決方法...我要告訴他們什麼?請從路徑名稱中刪除字符代碼X? – 2011-12-19 14:47:18

1

如果你只是想顯示用戶提交的文件名並且不一定需要有效的文件名,您可以剝去任何字符直到最後一個/或\字符:

string result = name.Substring(name.LastIndexOfAny(new[] { '/', '\\' }) + 1); 

LastIndexOfAny返回-1,如果沒有/或\被發現,所以原始的字符串在這種情況下返回。)

不要忘記它顯示給用戶時,HTML編碼的文件名。

+0

+1這是可行的,雖然不完善。 – 2011-12-19 15:17:05

-1

我通常將DateTime.Now.Ticks添加到文件名或用戶ID(和蜱)的開頭,然後我可以根據這些詳細信息處理/移動文件。

是否有可能導致問題的字符是a。 (我不確定Windows在一個文件名開頭處理得非常好