使用tomcat做图片服务器的的目的
主要是因为项目小,暂时不需要大的解决方案,在就是避免频繁的更新导致的图片等数据文件的备份留存问题。
除了可以使用tomcat做图片服务器之外,同样也可以使用tomcat的虚拟路径解决问题。
几个步骤,整理一下,附带上传到tomcat图片服务器的上传代码
-步骤一
更改tomcat端口,如果图片服务器的tomcat跟应用服务器在同一台机器上,那么请更改图片服务器的三个端口,避免端口冲突。
-步骤二
更改tomcat的读写权限
图片服务器Tomcat的设置 tomcat/conf/web.xml中内容更改
注意readonly 的value。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
-步骤三
-步骤四
以下附带图片上传code,使用的是jersey client。请根据自己情况改造。
//上传图片 通过@RequestParam(required = false) MultipartFile获取图片
@RequestMapping(value = "/upload/uploadPic.do")
public void uploadBrandPic(@RequestParam(required = false) MultipartFile uploadPic,HttpServletResponse response){
//图片名称生成策略---采用时间格式(精确到毫秒)并追加随机3位(10以内)数字
//精确到毫秒
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String picName = df.format(new Date());
//随机再生成3位 10以内的数
Random r = new Random();
for(int i=0;i<3;i++){
picName += r.nextInt(10);
}
//获取扩展名
String originalFilename = uploadPic.getOriginalFilename();
String ext = FilenameUtils.getExtension(originalFilename);
//相对路径
String path = "upload/" + picName + "." + ext;
//全路径
String url = http://localhost:8088/image-web/ + path;
//jersey 发送另一台Tomcat(可读写的)
Client client = new Client();
WebResource resource = client.resource(url);
try {
resource.put(String.class, uploadPic.getBytes());
} catch (UniformInterfaceException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClientHandlerException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
虚拟路径解决(一下转载) 原文地址:http://my.oschina.net/pingdy/blog/381001
现在一般的项目都可能会涉及文件的上传与下载,那如何管理这些文件呢?做法各有千秋!今天我也分享下我是怎么去管理这些文件的!当然了,这样的方式只适用于文件量小的情况下!如果文件数量非常庞大,那可以考虑一些开源的解决方案! 最初,我们会把一些文件直接放置在服务器中或者是直接放置在工程目录中!这样的好处是访问文件方便,但是也有弊端,个人认为维护性差原因可能有我们的工程可能会频繁的更新,没更新一次就得先保留一份数据,这样是很繁琐的!
使用Tomcat虚拟路径可以达到一个怎样的效果呢?简单说你可以把上传的文件放在你想发的任何一个地方,同时可以自己区分
下文件的类型,图片文件专门放一个地方,压缩包文件放另一个地方。
其实如何配置非常简单,这里以window环境来说明!
首先找到tomcat目录下conf目录下的server.xml文件
在server.xml文件中找到<Host></Host>
然后在其中加上这两句
<Context path="/demo/file" docBase="D:\demo\File\file"></Context>
<Context path="/demo/image" docBase="D:\demo\File\image"></Context>
解释下这两句话的意义
以tomcat在本机跑为例 一般是http://localhost:8080
当你访问http://localhost:8080/demo/file/xxx.zip或者是http://localhost:8080/demo/image/xxx.jpg
的时候,tomcat就会把请求转发,去请求tomcat所在的物理机上的D盘下D:\demo\File\file下的xxx.zip文件和xxx.jpg
文件
当文件上传的时候只需要把相应的文件存放到相应的目录中在数据库中存放文件的路径:
这里最好在数据库中存放xxx.zip 或者xxxx.jpg这样的文件名
为什么?
这样更方便服务器迁移!比方说你tomcat服务器需要切换到另一台物理机上,那么原先存放在数据库中的全地址就不可以用了
所以,比较好的方法是 服务器地址信息可以使用配置文件来管理,请求文件的全地址就后台拼装好即可,这样就算要做迁移 ,
也只是改改配置文件,把文件拷贝一份到新的物理机上,其他无需改!
还有一点需要注意下:
我们在做测试的时候,开发工具都是使用Eclipse,Eclipse有个比较恶心的地方就是每次重新启动tomcat的时候会把tomcat
中的配置信息重置一遍!所以导致看不到效果!稍微注意下。
以上纯粹个人愚见,仅供参考!
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="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"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="/demo/file" docBase="D:\demo\File\file"></Context>
<Context path="/demo/image" docBase="D:\demo\File\image"></Context>
</Host>