Почему HttpUtility.UrlEncode(HttpUtility.UrlDecode( "%20" )) возвращает + вместо %20?

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

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

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

Проблема в том, что если у someFileName было место в нем, например, "проверьте этот out.txt", тогда пользователю будет предложено загрузить "check_this_out.txt".

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

HttpUtility.UrlEncode(someFileName);

Но он заменяет пробелы знаками плюс, которые меня тошнило. Итак, я просто попробовал

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

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

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

Ответы

Ответ 1

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

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

Мы сделали следующее в нашем приложении. (a репозиторий документов на основе 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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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.

Ответ 5

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

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

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