手头问题:以下代码有时会抛出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