当前位置: 首页 > 面试题库 >

Java为什么会自动解码URI编码的文件名中的%2F?

宰父才
2023-03-14
问题内容

我有一个Servlet,需要写出具有用户可配置名称的文件。我正在尝试使用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

%2FURI中有时。

我打算只逐字使用URLEncoded字符串,而不是尝试使用File(uri)构造函数。


问题答案:

new File(URI)构建了基于由获得的路径上的文件URI#getPath(),而不是你-
什么expected-
URI#getRawPath()。这看起来像“通过设计”功能

您有2个选择:

  1. 运行URLEncoder#encode()fn两次(注:encode()不是encoder())。
  2. 使用new File(String)代替。


 类似资料:
  • 问题内容: 这段代码使我凝视了几分钟: (这里的第137行) 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 它不是一个keyword,而是一个label。 用法:

  • The Python Imaging Library uses a plug-in model which allows you to add your own decoders to the library, without any changes to the library itself. Such plug-ins usually have names like XxxImagePlugi

  • 在尝试让Liberty容器工作时,我遇到了以下问题。 对于数据库连接,我在server.xml中有一个像这样的AuthData部分: 当我试图用未编码的密码运行服务器时,数据库连接按预期工作,但是当密码被编码时,我得到这条消息:连接被拒绝(连接被拒绝)。错误代码=-4499,SQL State = 08001 dsra 0010 e:SQL State = 08001,错误代码=-4499 在设置

  • 我有一个编码为base64的SVG文件,我想用ImageView显示图像。这是我尝试过的: 但是decodedByte总是返回null。 附注: 此代码适用于jpeg图像。 如果Bas64字符串包含Bas64前缀("data: Image/svg xml; Bas64,"或"data: Image/jpeg; Bas64,),则decdedByte也总是返回null Bas64字符串是正确的(它在

  • 问题内容: 我有以下代码: 在我的Documents文件夹中,有一个名为“öß.pdf”的文件。这是Java 6下的输出: 但是这是Java 7下的输出: 请特别注意,返回由!! 返回的文件。是什么赋予了?有没有什么办法解决这一问题?这似乎很像Java 7错误… 问题答案: 在Oracle的帮助下,我们发现了一种解决方法:未在Eclipse中(以及从JNLP或其他任何地方启动时)将环境变量设置为。

  • 问题内容: 在W3 Schools URL编码网页 上看到,它说应该被编码为,并且应该被编码为。 我已经尝试了和,但是上述方法都没有正确执行: 由于某些原因,电子邮件地址正确但不能空格,并且货币而不是电子邮件地址。 我应该如何编码这两个参数,以与w3schools所说的正确(或w3schools错误)相一致? 问题答案: 尽管我认为@fge的答案是正确的,但是由于我使用的是基于W3Schools文