Почему HttpUtility.UrlEncode (HttpUtility.UrlDecode ("% 20")) возвращает + вместо% 20? - PullRequest
15 голосов
/ 13 октября 2009

У меня проблема с загрузкой файла, когда загрузка заменяет все пробелы подчеркиванием.

В основном у меня проблема здесь:

Response.AddHeader("Content-Disposition", 
    "attachment; filename=" + someFileName);

Проблема в том, что если в someFileName есть пробел, такой как «check this out.txt», то пользователю будет предложено загрузить «check_this_out.txt».

Я подумал, что лучшим вариантом будет UrlEncode имени файла, поэтому я попытался

HttpUtility.UrlEncode(someFileName);

Но это заменяет пробелы со знаком плюс, что озадачило меня. Тогда я просто попробовал

HttpUtility.UrlEncode(HttpUtility.UrlDecode("%20"))

и декодирование работает правильно и дает мне пробел, но кодирование занимает пробел, а затем снова дает мне знак плюс.

Что мне здесь не хватает, это правильно? Если да, то как мне правильно кодировать пробелы в% 20, что мне и нужно.

Ответы [ 5 ]

16 голосов
/ 13 октября 2009

Обычно оба% 20 и + являются допустимыми способами кодирования пространства. Очевидно, что метод UrlEncode должен выбрать один опций ... если он выберет другой путь, кто-то другой спросит, почему UrlEncode(UrlDecode("+")) вернул "% 20" ...

Вы всегда можете закодировать его, а затем просто заменить прямую строку на «+» для «% 20». Я думаю , что будет работать ...

9 голосов
/ 13 октября 2009

Я подумал, что лучшим вариантом будет UrlEncode файла

Это неправильный способ помещать внеполосные символы в параметр заголовка, такой как Content-Disposition-filename, и работает (иногда) только в IE из-за ошибки. На самом деле это вечная проблема: нет правильного пути .

Если вам нужно поместить специальные символы в загружаемое имя файла, вы не можете сделать это надежно с Content-Disposition-filename. Вместо этого пропустите параметр «filename» в заголовке Content-Disposition-attachment и оставьте желаемое имя файла в завершающей части URL. При отсутствии параметра имени файла браузер извлекает его из URL-пути, где URL-кодировка является правильным способом решения специальных символов.

6 голосов
/ 13 октября 2009

Цитата из эта ссылка

Я сам с этим сталкивался. если ты могут изменить пробелы на% 20 тогда IE7 конвертирует их правильно. Firefox хоть и возьмет их буквально (по крайней мере, при использовании Контент-заголовок) нужно будет сделать это для запросов от Только для IE7.

Мы сделали следующее в нашем приложении. (а хранилище документов на основе Tomcat)

String userAgent = request.getHeader("User-Agent");
if (userAgent.contains("MSIE 7.0")) {
    filename = filename.replace(" ", "%20");    
}         
response.addHeader("Content-disposition",
    "attachment;filename=\"" + filename + "\"");
2 голосов
/ 27 января 2011

Привет Я также столкнулся с такой же проблемой при загрузке файлов с пробелами в них.

Пожалуйста, смотрите ссылку, которая лучше всего подходит и дает полный ответ.

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

Ради понимания я просто добавляю код ASP.net, как решить эту проблему.

string document = @"C:\Documents and Settings\Gopal.Ampolu\My Documents\Downloads\" + "Disciplinary & Grievance Procedures..doc";
string filename = "Disciplinary & Grievance Procedures..doc";

Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", @"attachment; filename=""" + HttpUtility.UrlDecode(filename) + @"""");
Response.Flush();

Из приведенного выше видно, что при добавлении заголовка к ответу имя файла заключается в двойные кавычки. Убедитесь, что «имя файла» должно быть расшифровано с помощью UrlDecode.

1 голос
/ 01 августа 2013

Также есть еще один вариант, если вы можете информировать клиентов об обновлениях Windows Hotfix, доступных по адресу:

Обновление Windows Hotfix для проблемы пробелов в IE

Это сторона клиента, поэтому может быть неприменима ко всем сценариям, но все же возможна опция, если это возможно.

...