手头的问题:以下代码有时会抛出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 :(得分:1)
替换字符是不安全的。您应该验证文件名并在不支持时提示用户修复它(这是完全合法的,即使您的操作系统对文件名有限制)。 否则你可以:
答案 1 :(得分:1)
如果您只想显示用户提交的文件名,并且不一定需要有效的文件名,则可以删除任何字符,直到最后一个/或\字符:
string result = name.Substring(name.LastIndexOfAny(new[] { '/', '\\' }) + 1);
( LastIndexOfAny 如果找不到/或\则返回-1,因此在这种情况下返回原始字符串。)
在向用户显示文件名时,不要忘记对文件名进行HTML编码。
答案 2 :(得分:-1)
我通常将DateTime.Now.Ticks添加到文件名的开头或用户ID(以及刻度),然后我可以根据这些细节处理/移动文件。
引起问题的角色是否可能是a。 (我不确定Windows在文件名开头是否能很好地处理。