项目需要用到上传功能,所以想把上传后的图片保存在Tomcat的根目录下,发现Tomcat和Tomcat获取根目录有所不同,特此记录。
Java获取Tomcat根目录示例代码如下
private HttpServletRequest request = ServletActionContext.getRequest();
String path = request.getSession().getServletContext().getRealPath("/");
System.out.println("path = " + path);
String picturePath = request.getSession().getServletContext().getRealPath("/picture");
System.out.println("picturePath = " + picturePath);
String url = request.getSession().getServletContext().getRealPath("");
System.out.println("url = " + url);
int ch = url.lastIndexOf("\\");
String webapp = url.substring(0, ch);
System.out.println("webapp = " + webapp);
String home = System.getProperty("catalina.home");
System.out.println("home = " + home);
String home2 = System.getProperty("catalina.home");
System.out.println("home2 = " + home2 + "\\webapps");
使用的测试工具为postman
测试结果如下:
Tomcat7:
Tomcat8:
此时,我们可以发现 request.getSession().getServletContext().getRealPath("/") Tomcat7和8获取的路径是一样的,都是获取你项目路径xxx,但是 request.getSession().getServletContext().getRealPath("") 获取的路径有所不同,而且 webapp在Tomcat可以直接获取,而Tomcat8则不能,需要使用其他方法来实现。
我们可以用更好的方法来实现,就是
String home2 = System.getProperty("catalina.home");
System.out.println("home2 = " + home2 + "\\webapps");
这样无论是Tomcat7还是Tomcat8都可以获取到正确的webapps路径了。
或者配置Tomcat的server.xml文件配置虚拟映射路径
1、修改Tomcat的server.xml文件,添加Context 字段
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 设置虚拟路径[访问时路径为/picture] -->
<Context path="/picture" docBase="F:\picture" reloadable="true" />
其中path是映射的虚拟路径(可视具体情况配置),docBase是静态资源存放的真实物理路径,reloadable指有文件更新时,是否重新加载,一般设置为true后,tomcat不需要重启启动,自动热加载
2、此时,直接打开 http://localhost:8080/picture/xxxxxxxx.jpg 即可打开图片或上传文件到 http://localhost:8080/picture/ 即可。
结论:一般获取路径都是用于上传或者下载内容,我们可以用上面代码获取路径,也可以直接配置Tomcat的虚拟路径,但最好的方法就是使用云储存,使用云储存存储图片或者文件,可以很大程度减轻服务器压力,也不需要怎么去管理,非常方便,并且现在的云存储大多数都是10G免费试用。