【问题标题】:FileUpload.FileName behavior when there is a semi-colon or opening bracket in the file name文件名中有分号或左括号时的 FileUpload.FileName 行为
【发布时间】:2012-09-02 21:33:38
【问题描述】:

我有一个 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
    }
}

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

在文件名中检测到以下字符

# & } +

在文件名中未检测到以下字符

; {

为什么?

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

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

  • Final;Version.pdf //;未检测到

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

  • Policies}20120303.pdf //} 检测到

下面的cmets中提到,这些字符在字符串上没有问题,那么可能是“FileName”的值或FileUploader处理文件名的方式有问题?

编辑 2: Breakpoint step through显示,以Policies{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: 感谢下面一些有用的 cmets,我尝试使用不同的浏览器(Chrome),它工作得很好!文件名保持不变,即使是 foo;bar{baz.txt。我使用 Opera,但它不起作用。我想这将它缩小到浏览器特定问题的范围内。我不认为有任何方法可以在 Opera 中正常工作,除非有人有任何想法?

【问题讨论】:

  • "{".Contains("{") 为我工作。浏览器对文件名的编码是否错误?
  • 那么可能是文件名和文件上传器有问题。我刚刚用我尝试过的文件名编辑了我的问题。
  • 为什么不检查FileUpload1.FileName的结果?
  • 我尝试使用文件名“foo;bar{baz.txt”模拟您的问题,但我能够检测到“{”和“;”
  • 旁注 - 为什么不将 good 字符列入白名单,而不是将“bad”字符列入黑名单?我不确定你要保护什么,但你确定你的坏角色列表是完整的吗?使用白名单更容易确定。

标签: c# string char contains


【解决方案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.
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多