我正在目录博客下运行一个webapp。 (例如www.example.com/blog)。
我想获取请求的真实文件系统路径。
e.g. 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
正确的方法是什么?
您假设文件有真实路径,而不必为true。 Web应用程序容器可能用尽了.jar文件而没有本机文件路径。
@UwePlonus那与我问的问题无关。
简短答案
若要获得所需的结果,请使用HttpServletRequest#getServletPath()方法作为getRealPath()方法的参数。
这是最接近您想要完成的工作(请阅读下面的注释)。
说明
之所以得到这样的路径(使用double blog)是因为您使用的是getRequestURI()方法返回的结果。
getRequestURI()方法返回以应用程序上下文开头的路径。在您的情况下,它将是:
/blog/test-file.html
然后会发生什么,getRealPath()方法将getRequestURI()方法返回的字符串附加到文件夹的实际路径/物理路径,您的应用程序位于文件系统上,在您的情况下为:
/usr/share/tomcat7/webapps/blog/
因此,结果路径为:
/usr/share/tomcat7/webapps/blog/blog/test-file.html
这就是您出现双重blog问题的原因。
重要的提示
免责声明
OP可能已经知道下面编写的信息,但是出于完整性考虑而编写。
您尝试获取的真实路径并不意味着您正在获取文件系统上的真实路径。在web.xml中配置的url-pattern(或者如果您在相关注释中使用Servlet 3.0+)实际上是逻辑/虚拟路径,它可能与文件系统上的实际物理路径有关,也可能与之无关。指定的模式(路径)不需要物理存在。
还引用ServletContext.getRealPath(String)文档(重点是我的):
Gets the real path corresponding to the given virtual path.
对我的确认:)。 很有帮助