【1】eclipse下配置Tomcat虚拟路径映射
遇到问题介绍:项目中上传文件到服务器。如果使用tomcat下的目录作为上传图片的路径,则每次重启服务器图片将消失。
因为开发工具的项目中没有该图片,每次重启服务器重新部署的时候将会删除开发工具的项目中不存在的文件
解决:可以使用tomcat的配置文件将某个请求 映射到 物理路径下 ,完成图片的回显—在Tomcat的server.xml设置虚拟路径!
如,请求http://localhost:8080/upload/resources/1.jpg
,让其自动去本机D盘D:\upload\resources
路径下寻找
操作步骤:
找到Tomcat/conf/server.xml文件
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- 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 docBase="MavenWebProject" path="/MavenWebProject" reloadable="true" source="org.eclipse.jst.jee.server:MavenWebProject"/>
<Context docBase="JavaSE-JS" path="/JavaSE-JS" reloadable="true" source="org.eclipse.jst.jee.server:JavaSE-JS"/>
<!-- 这里添加以下语句-->
<!-- To Solve upload file -->
<Context path="/upload/resources/" docBase="D:\upload\resources\"></Context>
</Host>
重启Tomcat,这样当请求http://localhost:8080/upload/resources/1.jpg
,
服务器会自动去本机D盘D:\upload\resources
路径下寻找图片1.jpg。
上面示例没有添加contextPath,如果访问URL存在contextPath呢?如下所示:
# url
http://localhost:8080/furniture/upload/1.jpg
# 虚拟路径设置
<Context docBase="D:\my\upload\" path="/furniture/upload" reloadable="true"/>
这里处理的是动态上传图片并且进行图片回显。
如果是Eclipse下项目中的静态资源文件,部署的时候会同时部署到Tomcat/webapps(Eclipse默认的项目发布目录不是为Eclipse自身下的一个文件夹,请手动修改)下。
可以直接请求,不用进行目录映射。
题外话:
如果Tomcat重启后,发现修改的server.xml自动还原了。
两种解决思路:
① 修改Eclipse工具下的Servers里面的server.xml , 使其保证与你想要修改成的目标一致。
因为自动发布的时候,会默认加载这里面的context.xml 和 server.xml !
② 取消自动发布 !
【2】IDEA下配置虚拟路径映射
如果你使用的是idea运行项目,那么按照上面方式修改server.xml不生效。可以在idea中配置,如下图:
【3】上传到项目路径下
虚拟路径映射有一定难度,而且项目拷贝还需要拷贝制定文件夹。所以也可以考虑上传到项目路径下。
代码示例:
/**
* 根据字符串创建本地目录 并按照日期建立子目录返回
* @param path
* @return
*/
private String getFolder(String path) {
SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd");
path += "/" + formater.format(new Date());
File dir = new File(this.getPhysicalPath(path));
if (!dir.exists()) {
try {
dir.mkdirs();
} catch (Exception e) {
this.state = this.errorInfo.get("DIR");
return "";
}
}
return path;
}
/**
* 根据传入的虚拟路径获取物理路径
*
* @param path
* @return
*/
private String getPhysicalPath(String path) {
String servletPath = this.request.getServletPath();
String realPath = this.request.getSession().getServletContext()
.getRealPath(servletPath);
return new File(realPath).getParent() +"/" +path;
}