1、起因以及第一个方法(不可行)
最近在做一个博客系统,其中有一个功能是上传头像,起初用的是String tomcatPath =request.getSession().getServletContext().getRealPath("/upload");这个方法,这个方法上传到webapps下面项目目录(eclipse在wtpwebapps),创建了一个upload文件,但是每当更改java代码重新编译时这个文件夹就会消失,这个问题让我很头疼。
2、原因
找到原因如下:
当我们在开发过程中,是需要不断redeploy的,当你redeploy时你的IDE大概做了这些事情:
1. 重新编译你写的代码,生成classs文件夹
2.将你的项目部署到服务器(在此指tomcat)的webapps目录下,如果有与将要部署的项目同名的文件夹则会删除后再部署!!!
3.重新启动tomcat或者热部署
嗯.没错,你文件上传完之后文件的确实实在在的在磁盘里,但是当你又写其他模块,或者重启服务器时,那么你的DIE会redeploy,然后你的IDE会检测到webapps目录下已经有了这个文件夹,那么它会删除的它,然后再将最新编译的代码部署过去,简单的说呢,就是替换了~当然 "/项目/upload" 文件夹也被替换了,所以里面的东西都没了。
3、第二个方法(在谷歌上面不可行)
通过查询资料,查找到我们可以直接方法webapps文件夹下面,然后通过localhost:8080/upload/xxx.png就可以访问了,这样编译的时候就不会删除这个文件夹和里面的东西。我通过如下方法获得了webapps下的upload的目录:
//获取到tomcat位于系统的绝对磁盘路径,精确到项目下.此为:D:\apache-tomcat-8.0.36\wtpwebapps\JavaBlog\
String tomcatPath =request.getSession().getServletContext().getRealPath("/");
//此为:D:\apache-tomcat-8.0.36\wtpwebapps\JavaBlog
tomcatPath = tomcatPath.substring(0,tomcatPath.length()-1);
//此为:D:\apache-tomcat-8.0.36\wtpwebapps
tomcatPath = tomcatPath.substring(0,tomcatPath.lastIndexOf("\\"));
String realPath = tomcatPath+"\\upload\\";
本来一位一切都会顺利执行,但是很伤心,输入localhost:8080/upload/xxx.png就出现了谷歌浏览器报错 Not allowed to load local resource,后来查询资料说是因为谷歌浏览器禁止直接访问磁盘文件(估计是出于安全考虑,要不然的话通过浏览器就可以访问本地的东西确实有点危险)。这样的话就必须要解决这个无法访问本地资源的问题,所以呢。又开始收集资料。
4、解决Not allowed to load local resource的问题
修改server.xml文件如下:在host标签中添加
<Context path="/imgs" docBase="E:\apache-tomcat-9.0.16\wtpwebapps\upload" debug="0" reloadable="true"/>
其中docBase是真实的绝对路径,而/imgs是虚拟路径。这样我访问localhost:8080/upload/xxx.png就ok了,同时可以上传头像了,在我满心欢心的时候,以为欧克的时候,又出现了问题。我重启了一下tomcat,发现localhost:8080/upload/xxx.png报了一个404错误。偶买噶。
接着查资料,后来发现原来是因为我用的是eclipse,所以还需要修改eclipse的server.xml文件,每一次重启服务,都会通过eclipse的server.xml文件更新tomcat的server.xml文件,所以上次404是因为设置的被清除了,eclipse的server.xml文件一般在工作空间下的.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf,修改如下:
<Context path="/imgs" docBase="E:\apache-tomcat-9.0.16\wtpwebapps\upload" debug="0" reloadable="true"/>
这样一6猛如虎的操作后确实重启服务都可以正常了,以为世界安静了下来,但是当你关闭eclipse的时候会发现。还是太年轻!!!
你以为这样就可以顺利运行了吗?
在记事本中的server.xml文件被覆盖,原因在于eclipse中的server.xml文件未被修改
修改server.xml,一部分代码
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<Context path="/imgs" docBase="E:\apache-tomcat-9.0.16\wtpwebapps\upload" debug="0" reloadable="true"/>
<Context docBase="JavaBlog" path="/JavaBlog" reloadable="true" source="org.eclipse.jst.jee.server:JavaBlog"/></Host>
</Engine>
</Service>
</Server>
世界终于安静了下来,可以去睡觉了!!!