我正在目录博客下运行一个webapp。(例如www.example.com/blog)。
我想获取请求的真实文件系统路径。
例如www.example.com/blog/test-file.html-> /usr/share/tomcat7/webapps/blog/test-file.html
我尝试了以下方法:
public String realPath(HttpServletRequest request, ServletContext servletContext){ String requestURI = request.getRequestURI(); String realPath = servletContext.getRealPath(requestURI); return realPath; }
但是,这返回
/usr/share/tomcat7/webapps/blog/blog/test-file.html
正确的方法是什么?
要获得所需的结果,请使用HttpServletRequest#getServletPath()method作为method的参数getRealPath()。
HttpServletRequest#getServletPath()
getRealPath()
这是最接近您想要完成的工作(请阅读下面的注释)。
之所以得到这样的路径(带有double blog),是因为您使用的是 getRequestURI() 方法返回的结果。
blog
所述 getRequestURI() 方法返回开始与该路径 应用上下文 。在您的情况下,它将是: /blog/test-file.html
/blog/test-file.html
然后会发生什么, getRealPath() 方法 将 getRequestURI() 方法返回的字符串 附加 到文件夹的实际路径/物理路径,您的应用程序位于文件系统上,在您的情况下为: /usr/share/tomcat7/webapps/blog/
/usr/share/tomcat7/webapps/blog/
因此,结果路径为: /usr/share/tomcat7/webapps/blog/blog/test-file.html
那就是你双重blog问题的原因。
免责声明 OP可能已经知道下面编写的信息,但是出于完整性考虑而编写。
您尝试获取的真实路径 并不意味着 您正在获取 文件系统上 的 真实路径 。的url- pattern在被配置 的web.xml (或者如果你在相关注释的Servlet使用3.0+)实际上是一个 逻辑/虚拟路径 ,其可以或可以不涉及实际的,物理路径的文件系统上,即, 图案(指定的路径)不必物理存在 。
url- pattern
还引用ServletContext.getRealPath(String)文档(重点是我的):
获取对应于给定 虚拟路径 的真实 路径 。