阿元的笔记

不学习就落后了

Tomcat简易图片服务器搭建新思路

                             Tomcat简易图片服务器搭建新思路

参考资料:

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,定位到<Host></Host>区域,在其中添加如下语句:

<Context path="/demo/image" docBase="/usr/local/image" reloadable="true" ></Context>

     其中,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,添加如下内容:
< Context aliases="/uploadFile=/usr/local/demo" > 
< /Context > 
其中demo.xml命名决定对哪个项目生效。
补充:aliases是tomcat 7中才有的,在tomcat8中已经失效,需要统一使用resource配置:
<Context >
    <Resources>
        <PreResources base="/mfs/ShareFile/static" className="org.apache.catalina.webresources.DirResourceSet" webAppMount="/static" />
    </Resources>
 </Context>
     而经过进一步的搜索,参考tomcat官网说明 和http://mikusa.blogspot.com/2014/07/tips-on-migrating-to-tomat-8-resources.html这篇文章,可以发现tomcat7的配置额外资源的方法非常多,而在tomcat8中,进行了统一的整合,具体内容可以详细参考第二篇参考资料链接。如果无法访问原址,可以看我的转载:https://blog.csdn.net/nplbnb12/article/details/80007888

 

 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nplbnb12/article/details/79973444
文章标签: tomcat 图片服务器
个人分类: tomcat
上一篇共享存储--openfiler搭建iscsi
下一篇tomcat8资源引用的一些小技巧
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭