Как правильно экранировать имя документа в .NET? - PullRequest
9 голосов
/ 22 февраля 2012

Мы храним кучу странных имен документов на нашем веб-сервере (люди загружают их), которые имеют различные символы, такие как пробелы, амперсанды и т. Д. Когда мы генерируем ссылки на эти документы, нам нужно экранировать их, чтобы сервер мог искатьфайл по его сырому имени в базе данных.Однако ни одна из встроенных escape-функций .NET не будет работать правильно во всех случаях.

Возьмите документ Hello#There.docx:

UrlEncode будет обрабатывать это правильно:

HttpUtility.UrlEncode("Hello#There");
"Hello%23There"

Однако UrlEncode будет не обрабатывать Hello There.docx правильно:

HttpUtility.UrlEncode("Hello There.docx");
"Hello+There.docx"

Символ + действителен только для параметров URL, но не для имен документов.Интересно, что на самом деле это работает на тестовом веб-сервере Visual Studio, но не на IIS.

Функция UrlPathEncode отлично работает для пробелов:

HttpUtility.UrlPathEncode("Hello There.docx");
"Hello%20There.docx"

Однако она не ускользнет от другихтакие символы, как #:

HttpUtility.UrlPathEncode("Hello#There.docx");
"Hello#There.docx"

Эта ссылка недействительна, поскольку # интерпретируется как хэш URL-адреса и даже не попадает на сервер.

Есть лиУтилита .NET, позволяющая экранировать все не алфавитно-цифровые символы в имени документа, или мне придется написать свой собственный?

Ответы [ 3 ]

14 голосов
/ 22 февраля 2012

Взгляните на метод Uri.EscapeDataString :

Uri.EscapeDataString("Hello There.docx")  // "Hello%20There.docx"

Uri.EscapeDataString("Hello#There.docx")  // "Hello%23There.docx"
6 голосов
/ 22 февраля 2012

Я бы подошел к этому по-другому: не используйте имя документа в качестве ключа при поиске - используйте Guid или другой параметр id, который вы можете сопоставить с именем документа на диске в вашей базе данных .Мало того, что это гарантирует уникальность, но у вас также не будет проблемы с побегом.

0 голосов
/ 22 февраля 2012

Вы можете использовать символ @ для экранирования строк. Смотрите ниже кусочки кода.

string str = @"\n\n\n\n";
 Console.WriteLine(str);

Вывод: \ n \ n \ n \ n

string str1 = @"\df\%%^\^\)\t%%";
Console.WriteLine(str1);

Вывод: \ df \ %% ^ \ ^) \ t %%

Этот вид форматирования очень полезен для имен путей и для создания регулярных выражений.

...