Tengo un servlet que necesita escribir archivos que tienen un nombre configurable por el usuario. Estoy tratando de usar la codificación URI para escapar correctamente de los caracteres especiales, pero el JRE parece convertir automáticamente barras diagonales codificadas %2F
en separadores de ruta.¿Por qué Java decodifica automáticamente% 2F en nombres de archivos codificados URI?
Ejemplo:
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());
La salida es:
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
Después se crea una instancia del objeto nuevo archivo, la secuencia de %2F
se convierte automáticamente en una barra diagonal y termina con una ruta incorrecta . ¿Alguien sabe la forma correcta de abordar este problema?
El núcleo del problema parece ser que
uri.equals(new File(uri).toURI()) == FALSE
cuando hay una %2F
en el URI.
Planeo usar la cadena URLEncoded textualmente en lugar de intentar usar el constructor File(uri)
.
Es ciertamente correcto para hacerlo. Si necesita una literal "% 2F" en el nombre del archivo, debe escaparse correctamente cuando se utiliza en un URI: '% 252F' – Joey
Creo que no entiende bien. No quiero codificar '% 2F', quiero codificar '/' para poder crear un nombre de archivo legal que represente un nombre especificado por el usuario que contenga la barra diagonal. – Lucas
Fuera de interés: Sé que estos son URI de archivos, pero si fueran URI http ¿no deberían los servidores web manejar '% F2' y'/'lo mismo? Además: dado que '/' no es válido en el nombre de archivo de una ventana, dicho URI de archivo no parece tener sentido, o? – RoToRa