我有一个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 // +检测到
Final; Version.pdf //;未检测到
WhyHello {there.pdf // {NOT detected
政策} 20120303.pdf //}已检测到
正如下面的评论中所提到的,字符串上的这些字符没有问题,因此可能是“FileName”的值或FileUploader处理文件名的方式有问题吗?
编辑2: 断点逐步显示,使用策略{20120303.pdf作为示例,FileName的值是Policies.pdf。所以这不再是.Contains()的问题,而是使用FileUpload和FileName。
所以新问题是,我该如何处理?我不希望有这些字符的文件通过,我不希望提交的文件的名称与用户命名的文件不同。因此,如果有人试图提交“政策{20120303.pdf”,我需要两个结果中的一个:
编辑3: 如果我提交具有以下名称的文件: foo; bar {baz.txt ,则FileUpload.FileName的值为“ foo.txt ”
编辑4: 感谢下面的一些有用的评论,我尝试使用其他浏览器(Chrome),它工作得很好!文件名保持不变,即使使用foo; bar {baz.txt。我使用Opera,它没有用。我想这会使浏览器特定问题缩小很多。除非有人有任何想法,否则我认为在Opera中没有任何方法可以正常工作吗?
答案 0 :(得分: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.
}
但是,在我的情况下,我在文件对象中设置文件名之前检查用户提供的字符串。我认为这也可能解决你的问题。
我猜测某个地方有一个函数可以在你进行验证之前改变字符串。