Подтвердить что ты не робот

FileUpload.FileName, когда в имени файла есть полуколонна или открывающая скобка

У меня есть элемент управления 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//{НЕ обнаружено

  • Политики} 20120303.pdf//} обнаружено

Как упоминалось в комментариях ниже, нет никаких проблем с этими символами в строках, так что, может быть, это проблема со значением "FileName" или способом, которым FileUploader обрабатывает имя файла?

Изменить 2: Точка точки останова показывает, что с помощью Политики {20120303.pdf в качестве примера значение FileName - Policies.pdf. Так что это не проблема с .Contains(), но с FileUpload и FileName.

Итак, новый вопрос: как я могу справиться с этим? Я не хочу, чтобы файлы с этими символами проходили, и я не хочу, чтобы предоставленные файлы были названы иначе, чем их назвал пользователь. Поэтому, если кто-то пытается отправить "Политики (20120303.pdf), мне нужен один из двух результатов:

  • обнаружено неверное имя, процедура отменена
  • отправьте файл с полным и оригинальным именем, Политики {20120303.pdf

Изменить 3: Если я отправлю файл со следующим именем: foo; bar {baz.txt, значение FileUpload.FileName " foo.txt"

Изменить 4: Благодаря некоторым полезным комментариям ниже я попытался использовать другой браузер (Chrome), и он работает отлично! Имя файла остается неизменным, даже с foo; bar {baz.txt. Я использую Opera, и она не работает. Я предполагаю, что это значительно сокращает проблему, связанную с браузером. Я не думаю, что будет какой-либо способ сделать эту работу должным образом в Opera, если у кого-то нет идей?

4b9b3361

Ответ 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.
}

В моем случае, однако, я проверяю строку, предоставленную пользователем, перед установкой имени файла в файловом объекте. Я думаю, что это, вероятно, также решит вашу проблему.

Я предполагаю, что где-то есть функция, которая изменяет строку до того, как вы дойдете до ее подтверждения.