Почему 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
Это клиентская сторона, поэтому не может быть применима ко всем сценариям, но по-прежнему является вариантом, если это возможно.