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

问题在眼前:下面的代码有时会抛出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);

但它只是感觉不对。

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

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

为了避免进一步的混乱。 提取的文件名​​不用于在磁盘上存储的文件,并且不必须是在主机环境的上下文中有效。 它简单地需要被显示给用户。

--------------解决方案-------------

如果你只是想显示的文件名由用户提交的,并不一定需要一个有效的文件名,你可以去掉所有的字符到最后一个/或\字符:

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

(LastIndexOfAny返回-1,如果没有/或\被发现,所以原始的字符串在这种情况下返回。)

它显示给用户的时候不要忘了HTML编码的文件名。

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

  1. 如你所说,替换不支持字符(但你怎么能保证你更换了所有可能的无效字符?)
  2. 编码的文件名

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

有没有可能是导致问题的字符是。 (我不知道窗口交易非常好了。在文件名开头的

分类:C# 时间:2012-08-25 人气:0
本文关键词: .NET,asp.net
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.462 (s). 10 q(s)