参考资料:
1、http://uule.iteye.com/blog/2211590
2、http://mikusa.blogspot.com/2014/07/tips-on-migrating-to-tomat-8-resources.html
本文主要介绍,通过直接配置tomcat搭建简易图片服务器的思路。
公司java开发的要求搭建一个tomcat图片服务器,我接到需求后,也是一脸懵逼。开发的意思是说,现在应用的图片资料都存在tomcat目录里,每次更新应用,图片都没了,而且没有办法迁移图片资料。上网查资料,介绍比较多的是nginx+vsftp的搭建方法,具体步骤也不太复杂,但是总感觉怪怪的,部门长也说不需要这么麻烦,让我直接更改tomcat下的server.xml就行了。没办法我又上网继续查资料,找了半天,然后就发现了虚拟路径这个关键词。
原来,一般的项目都可能会涉及文件的上传与下载,默认情况下,tomcat只让你访问应用内的目录,而通过配置虚拟路径,可以解除这个限制,让应用可以访问硬盘其他指定目录(包括NFS挂载)。这样,应用的更新和迁移就会变得方便许多,不必担心图片这类资料的丢失。具体的配置方法如下:
打开tomcat目录下conf目录下的server.xml,定位到
其中,path指映射的虚拟路径,docBase是实际的物理路径,reloadable:如果这个属性设为 true,tomcat 服务器在运行状态下会监视在WEB-INF/classes 和 WEB-INF/lib 目录下 class 文件的改动,如果监测到有 class 文件被更新的,服务器会自动重新加载 Web 应用。
这样设置完成后需要重启tomcat,当你访问http://localhost:8080/demo/image/xxx.jpg的时候,tomcat就会把请求转发,去请求物理硬盘绝对路径/usr/local/image下的xxx.jpg文件。
网上的资料也就止于此了,那么怎么上传文件呢???然后就没然后了。我查找了很多资料,最后找到了参考资料里的这篇博客,结合之前虚拟路径的失败经历,找到了具体的解决方案。
此前,我找研发要了上传图片的代码,硬着头皮去研究:
可以看到,代码里上传主要是基于BASE_PATH这个字符串 ,它决定了,图片会被传到应用根目录下的/uploadFile/article/下面。我在进行测试时,将应用目录下的uploadFile删除掉,然后重新在web端上传新图片,这个uploadFile目录就会重新生成,里面可以找到新上传的图片。原来的思路就是添加虚拟路径,直接指向这个文件夹,结果,应用还是按照原来的路径进行上传文件。
虚拟路径只是一个简单的路径映射,主要作用还是让应用包的位置更加随意,不必局限于本地的特定目录上,对于应用包本身是没有任何作用的!
在tomcat7中,添加了一个新特性:在war文件外使用别名去存储静态内容
Web应用程序需要静态资源文件,比如象CSS,Javascript和视频文件、图片文件等。通常都把它们打包放在war文件中,这将增加了WAR文件的大小并且导致很多重复的加载静态资源。一个比较好的解决方法是使用Apache HTTP服务器去管理这些静态文件资源,下面是一个apache httpd.conf文件的配置摘录:
< Directory "/home/avneet/temp/static" >
Order allow,deny
Allow from all
< /Directory >
Alias /static "/home/avneet/temp/static"
以上的设置,使得访问http://localhost/static时,能访问到放在/home/avneet/temp/static下的资源。
允许使用新的aliases属性,指出静态文件资源的位置,可以通过使用Classloader.getResourceAsStream('/static/...')或者在链接中嵌入的方法让TOMCAT去解析绝对路径,下面是一个在context.xml中配置的例子:
< ?xml version="1.0" encoding="UTF-8"? >
< Context path="/tomcat7demo" aliases="/static=/home/avneet/temp/static" >
< /Context >
假设/home/avneet/temp/static这个文件夹存放有一张图片bg.png,如果war文件以tomcat7demo的名字部署,那么可以通过以下三个方式去访问这张图片
1 直接访问
http://localhost:8080/tomcat7demo/static/bg.png
2 在HTML链接中访问:< img src="/tomcat7demo/static/bg.png" / >
3 通过JAVA代码访问: ByteArrayInputStream bais = (ByteArrayInputStream)getServletContext().getResourceAsStream("/static/bg.png");
使用aliases的好处是可以代替Apache的httpd.conf的设置,并且可以在servlet容器范围内访问,并且不需要Apache。
这个特性的关键之处在于,它可以直接影响指定的应用!而不是单纯的一个路径映射。以我的这个需求为例,研发要求将图片存储在应用外的硬盘空间上,我只需要在context.xml中对应用的/uploadFile映射到本地硬盘即可:
< Context path="/demo" aliases="/uploadFile=/usr/local/demo" >
< /Context >
其中demo是项目名,/uploadFile被映射到/usr/local/demo目录下,做完这一配置后,demo这个应用就会把本地的/usr/local/demo目录当作项目里的/uplaodFile进行读写操作,这样一个简单的配置,就可以在不更改项目的条件下,把需要的文件该存储到本地硬盘其他路径了。结合NFS、FTP等其他技术,就可以非常方便地搭建图片服务器了!
总结:利用tomcat 7的别名aliases,可以对指定项目进行指定路径的映射,将项目外的目录映射到项目内部进行读写操作,而不需要对项目本身进行任何更改,利用这一特性可以更方便的搭建简易图片服务器!aliases也可以这样配置:直接在tomcat根目录conf/Catalina/localhost下,新建文件demo.xml,添加如下内容: