#java #url-encoding
#java #url-кодирование
Вопрос:
Я не уверен, что полностью понимаю объект URI, чтобы сделать это правильно. Я хочу иметь возможность конвертировать строку в строку, закодированную в url. Например, у меня есть сервлет, действующий как обработчик файлов, и мне нужно указать имя файла в заголовке —
response.setHeader("Content-disposition", "attachment;filename=" new URI(filename).toUrl());
Как и ожидалось, я получаю URISyntaxException
, потому что строка, которую я кодирую, не имеет правильной формы URI.
Как я могу кодировать строки вместо URL-адресов?
Я не могу получить желаемые результаты, используя устаревший URLEncoder, потому что он заменяет «» на » » вместо «% 20».
Заранее спасибо!
Комментарии:
1. как выглядит ваше имя файла?
2. Это пробелы, с которыми у него проблемы. Допустим, я загружаю файл с именем «hello world.txt «когда я загружу его обратно, я получу «hello world.txt «. Я придираюсь к этому пункту, но это меня раздражало!
Ответ №1:
URLEncoder предназначен не для URL-адресов, как ни странно, на самом деле он предназначен для аргументов URL и других вещей, которым требуется MIME-кодирование application / x-www-form-urlencoded. Самый простой способ, который я нашел для URL-кодирования произвольной строки ‘s’, это new URI(null, s, null).toASCIIString()
.
Ответ №2:
Вы могли бы использовать URLEncoder
и просто заменить все
на
.
Кроме того, URLEncoder.encode(String s, String enc)
не является устаревшим.
Вы также могли бы использовать org.springframework.web.util.UriUtils.encodeURI.
Комментарии:
1. Ах, я этого не знал, я думал, что это вообще метод encode (). Это облом, но, похоже, мне придется заменить на , как вы предложили… по какой-то причине это не кажется элегантным.
2. Добавлена более элегантная альтернатива.
3. поскольку я уже загрузил Spring, это тоже должно хорошо работать. Я использовал ваше решение для его кодирования, а затем обнаружил, что оно содержит файл с закодированными символами… когда на самом деле мне просто нужно было заключить мою простую строку в кавычки. O_o
Ответ №3:
Вам следует лучше использовать new File( filename ).toURI().toURL()
. Это создаст правильную кодировку для имени файла. Это также работает для относительных имен файлов и файлов, которые не существуют. На самом деле эта конструкция не выполняет никакого доступа к файловой системе.
Комментарии:
1. Это сработало, как вы упомянули, но это дало полный путь к файлу. Немного волшебства в последнем индексе, и все получилось бы точно так же. Большое спасибо!
Ответ №4:
Используйте java.net.URLEncoder
например
String s = "somestuff@%#$%^3<<>>";
String encoded_string = URLEncoder.encode(s, "UTF-8");
Комментарии:
1. Неправильно обрабатывает пробелы для URL-адресов, только для аргументов URL.