У меня есть сервлет, который должен записывать файлы с настраиваемым пользователем именем. Я пытаюсь использовать кодировку URI для правильного экранирования специальных символов, но JRE, по-видимому, автоматически преобразовывает закодированные прямые косые черты %2F
в разделители пути.
Пример:
File dir = new File("C:\Documents and Setting\username\temp");
String fn = "Top 1/2.pdf";
URI uri = new URI( dir.toURI().toASCIIString() + URLEncoder.encoder( fn, "ASCII" ).toString() );
File out = new File( uri );
System.out.println( dir.toURI().toASCIIString() );
System.out.println( URLEncoder.encode( fn, "ASCII" ).toString() );
System.out.println( uri.toASCIIString() );
System.out.println( output.toURI().toASCIIString() );
Вывод:
file:/C:/Documents%20and%20Settings/username/temp/
Top+1%2F2.pdf
file:/C:/Documents%20and%20Settings/username/temp/Top+1%2F2.pdf
file:/C:/Documents%20and%20Settings/username/temp/Top+1/2.pdf
После создания нового объекта File последовательность %2F
автоматически преобразуется в косую черту, и я получаю неправильный путь. Кто-нибудь знает правильный подход к этой проблеме?
Суть проблемы заключается в том, что
uri.equals( new File(uri).toURI() ) == FALSE
когда в URI есть %2F
.
Я планирую просто использовать дословно закодированную строку URLE, а не пытаться использовать конструктор File(uri)
.