文件名中有分号或左括号时的FileUpload.FileName行为

Cpt*_*rkt 13 c# string contains char

我有一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以用另一个(更好的)方式,用正则表达式来做这个,但首先我真的想知道为什么上面的方法不起作用.

在FileName 检测到以下字符:

# & } +
Run Code Online (Sandbox Code Playgroud)

FileName 中未检测到以下字符:

; {
Run Code Online (Sandbox Code Playgroud)

为什么?

编辑:我尝试过的文件名示例.

  • Final + Version.pdf // +检测到

  • Final; Version.pdf //; 没有检测到

  • WhyHello {there.pdf // {未检测到

  • 策略} 20120303.pdf //}已检测到

正如下面的评论中提到的,字符串上的这些字符没有问题,所以可能是"FileName"的值或FileUploader处理文件名的方式有问题?

编辑2: 断点步骤显示,使用策略{20120303.pdf作为示例,FileName的值是Policies.pdf.所以这不再是.Contains()的问题,而是使用FileUpload和FileName.

所以新问题是,我该如何处理?我不希望有这些字符的文件通过,我不希望提交的文件的名称与用户命名的文件不同.因此,如果有人试图提交'Policies {20120303.pdf',我需要以下两种结果之一:

  1. 检测到无效名称,程序中止
  2. 提交文件的完整原始名称为Policies {20120303.pdf

编辑3: 如果我提交一个具有以下名称的文件:foo; bar {baz.txt,FileUpload.FileName的值为" foo.txt "

编辑4: 感谢下面的一些有用的评论,我尝试使用不同的浏览器(Chrome),它工作得很好!文件名保持不变,即使使用foo; bar {baz.txt.我使用Opera,它没有用.我想这会使浏览器特定问题缩小很多.除非有人有任何想法,否则我认为没有任何方法可以在Opera中正常工作?

PAU*_*SNE 1

我在程序中使用以下代码来检查文件名:

filename = txtFileName.Text;
if (filename == "" || (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1))
{
// Ask for a new file name, or whatever else you need to do.
}
Run Code Online (Sandbox Code Playgroud)

然而,就我而言,我在文件对象中设置文件名之前检查用户提供的字符串。我认为这也可能会解决你的问题。

我猜测某个地方有一个函数可以在验证字符串之前更改它。