Строки кодирования URL, которые не являются допустимыми URI

#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.