处理上传文件名称的正确方法

时间:2011-12-19 14:30:10

标签: c# asp.net .net

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

但感觉不对。

处理上传的文件名是否没有标准的“网络”方式?我很难接受我是第一个遇到这个问题的人。

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

避免进一步混淆。提取的文件名用于在磁盘上存储文件,并且不必在托管环境的上下文中有效。只需将其显示回用户即可。

3 个答案:

答案 0 :(得分:1)

替换字符是不安全的。您应该验证文件名并在不支持时提示用户修复它(这是完全合法的,即使您的操作系统对文件名有限制)。 否则你可以:

  1. 如你所说,替换不支持的字符(但是如何确保替换所有可能的无效字符?)
  2. 编码文件名

答案 1 :(得分:1)

如果您只想显示用户提交的文件名,并且不一定需要有效的文件名,则可以删除任何字符,直到最后一个/或\字符:

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

LastIndexOfAny 如果找不到/或\则返回-1,因此在这种情况下返回原始字符串。)

在向用户显示文件名时,不要忘记对文件名进行HTML编码。

答案 2 :(得分:-1)

我通常将DateTime.Now.Ticks添加到文件名的开头或用户ID(以及刻度),然后我可以根据这些细节处理/移动文件。

引起问题的角色是否可能是a。 (我不确定Windows在文件名开头是否能很好地处理。