SpringMVC+Tomcat配置虚拟路径保存、访问图片 & Tomcate重启后图片等文件消失解决方案

背景:

一些项目中往往需要上传一些图片文件之类,一般不建议直接保存在数据库内,往往是讲图片等资源保存在服务器的某个文件夹下,传统做法是上传到部署目录下,通过相对路径进行访问。这样当我们系统需要进行升级,进行全量更新的时候,就需要我们先将静态资源拷贝出来,然后项目部署成功之后又复制进部署目录。为了以后软件版本升级的方便,这时就需要这些静态资源放置在服务器tomcat目录外面。于是乎就有了配置tomcat的虚拟路径,通过把文件上传到tomcat的虚拟路径下,实际上是存放在tomcat中配置docBase的路径(绝对路径)下,事项了将程序的静态资源分开。

目的:

实现服务器和静态资源分开,在下一次升级服务器时不需要将服务器的中的静态资源(头像等)拷贝出来在进行升级。

环境:

编译环境:sts 3.9
JDK版本 :jdk 1.8
服务器 :Tomcat 8.5

事项步骤:

上传文件依赖的包:

  • commons-fileupload-1.3.jar
  • commons-io-1.3.1.jar
    在这里插入图片描述

配置两个Tomcat服务器的原因:

如果使用运行项目的服务器配置虚拟路径用来保存文件,会出现在重启tomcat重新部署项目之后,server.xml这个文件会恢复了(配置的虚拟路径消失了),针对这现象,可以另外配置一个服务器配置专门做文件的处理。
在同一个IDE配置两个Tomcat服务器教程可以看我的这篇博客

  1. 配置两个Toncat服务器
  2. 在不运行项目的Tomcat服务器的安装路径下的conf目录下找到server.xml文件,配置虚拟路径:
    在这里插入图片描述
    在节点中配置虚拟路径如下:docBase的路径为真实保存文件的路径,path的路径是虚拟的提供给程序进行存储的路径。
<Context docBase="E:\images" path="/photo"/>
  1. 在springmvc-servlet.xml文件中配置帮助事项文件上床的bean
<!-- 专门用来帮助文件上传的bean -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 文件最大上传容量 -->
		<property name="maxUploadSize">  
			<value>5042880</value>
		</property>
	</bean>
  1. 上传图片的页面(较为简单)
    在这里插入图片描述
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>上传图片</title>
</head>
<body>
<h1>上传图片</h1>
<form action="<%=request.getContextPath() %>/upload.do" method="post" enctype="multipart/form-data">
file:<input type="file" name="photo" /><br>
<input type="submit" value="upload" /><br>
</form>
<img src="http://localhost:7006${path}"> 
</body>
</html>
  1. Controller代码
package net.neuedu.springmvc.controller;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class TestCpntroller {
	@RequestMapping("upload.do")
	public ModelAndView upload(MultipartFile photo) throws IllegalStateException, IOException
	{	
		//原来的文件名字
		String oldName = photo.getOriginalFilename();
		String suffix = oldName.substring(oldName.indexOf('.'),oldName.length());
		//新的文件名,避免文件名重复,使用随机的UUID
		String newName = UUID.randomUUID().toString()+suffix;
		//"E:\\images\\"是最终上传的位置,newName是文件名
		File file=new File("E:\\images\\", newName);
		//上传文件
		photo.transferTo(file);
		
		//跳转到upload.jsp页面
		ModelAndView mav=new ModelAndView();
		//将在Tomcat中定义的虚拟路径提供给客户端访问
		mav.addObject("path", "/photo/"+newName);
		mav.setViewName("upload");
		return mav;
	}
}

上传结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code_mo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值