我有一个 FileUpload 控件,文件名有某些限制,某些字符是不允许的。以下代码适用于大多数字符,但由于某种原因不适用于其他字符:
if (FileUpload1.HasFile)
{
if (FileUpload1.FileName.Contains('#') ||
FileUpload1.FileName.Contains('&') ||
FileUpload1.FileName.Contains(';') ||
FileUpload1.FileName.Contains('{') ||
FileUpload1.FileName.Contains('}') ||
FileUpload1.FileName.Contains('+'))
{
//error: bad character detected
}
}
我可能可以使用正则表达式以另一种(更好的)方式做到这一点,但首先我真的想知道为什么上面的方法不起作用。
在 FileName中检测到以下字符:
# & } +
在 FileName中未检测到以下字符:
; {
为什么?
编辑:我尝试过的文件名示例。
Final+Version.pdf //+ 检测到
最终版本;版本.pdf //; 没有检测到
WhyHello{there.pdf //{ 未检测到
检测到策略}20120303.pdf //}
正如下面评论中提到的,字符串上的这些字符没有问题,那么可能是“FileName”的值或FileUploader处理文件名的方式有问题?
编辑 2: Breakpoint step through 显示,以 Policies{20120303.pdf 为例,FileName 的值为 Policies.pdf。所以这不再是 .Contains() 的问题,而是 FileUpload 和 FileName 的问题。
所以新的问题是,我该如何处理?我不希望包含这些字符的文件通过,并且我不希望提交的文件与用户命名它们的名称不同。因此,如果有人尝试提交“Policies{20120303.pdf”,我需要以下两个结果之一:
- 检测到无效名称,过程中止
- 提交带有完整和原始名称的文件,Policies{20120303.pdf
编辑 3: 如果我提交一个具有以下名称的文件:foo;bar{baz.txt, FileUpload.FileName 的值为“ foo.txt ”
编辑 4: 感谢下面的一些有用的评论,我尝试使用不同的浏览器(Chrome),它工作得很好!文件名保持不变,即使是 foo;bar{baz.txt。我使用 Opera,但它不起作用。我想这将它缩小到浏览器特定问题的范围内。我认为没有任何方法可以在 Opera 中正常工作,除非有人有任何想法?