后端:spring、springmvc、mybatis
前端:vue-element-admin
数据库:MySQL
服务器:多个Tomcat(启动后端项目、图片存放位置)
文件服务器
Tomcat作为文件保存服务器下面代码根据具体需求设置到Tomcat中的conf文件夹下的server.xml中的<Host>标签内</Host>
<!--
path:访问的url,比如设置path为/pic,当我们运行web项目的时候,访问的url就是:127.0.0.1:8080/pic
docBase:硬盘保存地址
reloadable:建议设置false,如果为true会实时检测WEB-INF/classes和WEB-INF/lib目录下class文件的变动,如有变动,会重新加载web应用。
虽然有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷
-->
<Context path="/pic" docBase="D:/Tomcat8.5.23/files" reloadable="false"></Context>
如果使用其他服务器请根据具体服务器进行配置
maven项目:
webapp中需要配置内容如下:
pom.xml中 文件上传依赖
<!-- 文件上传依赖 start -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- 文件上传依赖 end -->
web.xml 配置项:
<!--配置核心加载器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet-servlet.xml 配置项:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--编码-->
<property name="defaultEncoding" value="utf-8"/>
<!--上传大小(-1:不做任何限制)-->
<property name="maxUploadSize" value="-1"/>
</bean>
后端代码:controler层
将文件上传功能、添加和更新功能同时提交到后端,下面代码只实现单个前端文件上传功能
@ResponseBody
@Controller
@CrossOrigin
public class FileController {
//本地保存地址,另一个Tomcat当做服务器进行文件上传成功后的保存位置
private final String fileLocal = "D:\\Tomcat8.5.23\\files";
@Resource
private GoodsService goodsService;//mapper层的接口:主要的增删改查。
//file:前端传入的文件
//goodsId:更新时的主键id
@RequestMapping(value = "/fileUpload")
public Result fileUpload(MultipartFile file, Integer goodsId) throws IOException {
//获取前端上传的文件名称
String filename = file.getOriginalFilename();
//获取文件格式
//filename.lastIndexOf("."):从.开始进行截取
//filename.length():到文件名长度进行截取结束
String suffix = filename.substring(filename.lastIndexOf("."), filename.length());
//对文件上传格式进行限制(可以设置为具体的格式--根据自己的需求设置)
if (suffix.contains(".jpg") || suffix.contains(".jpeg") || suffix.contains(".png") || suffix.contains(".gif")) {
//生成新的文件名称(通过UUID生成唯一的名称)
filename = UUID.randomUUID().toString() + suffix;
//将文件保存到服务器中(Tomcat作为服务器保存的位置)
file.transferTo(new File(fileLocal + "/" + filename));
if (goodsId != null) {//判断bookId是否有值
//调用删除旧的图片地址的方法
deleteFile(goodsId);
}
//将图片在服务器端的地址返回(为了将地址传入到数据库中进行保存)
return bookUrl= new Result("/pic/" + filename);
} else {
//上传失败时返回异常
throw new BookException(BookStatus.FILE_SUFFIX_ERROR);
}
}
//删除旧文件方法
public void deleteFile(Integer goodsId) {
//查询数据库中是否有数据
Goods goods = goodsService.getGoodsOne(goodsId);
//获取数据库中保存的url地址
String goodsUrl = goods.getGoodsUrl();//例如:bookUrl存储格式:"/pic/9359e585-7c59-4c8a-9648-c5600f76db85.jpg"
//通过bookId查询数据库表bookUrl是否为有值
if (goodsUrl != null) {
//删除之前拼接的'/pic/';+5是获取‘/pic/’并从第5个开始截取(因为使用的并非单个字符串所以要加上从数字,代表从第几个开始截取)
//获取旧的文件的真实文件名
String suffix1 = goodsUrl.substring(goodsUrl.lastIndexOf("/pic/") + 4, goodsUrl.length());
//拼接真实地址
goodsUrl = fileLocal +"\\" + suffix1;
//将本地文件加入到File中
File fileToDelete = new File(goodsUrl);
//通过File中的删除方法,将本地存放的旧文件进行删除
boolean success = fileToDelete.delete();
if (success) {
System.out.println("旧的文件删除成功……");
} else {
System.out.println("旧的文件删除失败……");
}
} else {
System.out.println("数据库中,未存储文件地址……");
}
}
}
对文件地址方面进行解释下:
不使用具体的文件保存地址 保存到数据库,是为了便于后期的文件迁移
(将文件迁移到新地址后,只需要更改服务器配置就可以了,不需要对数据库保存的文件地址进行更改)
上述为上传功能的个人学习记录,代码不全,仅可作为思路参考。
----------个人学习笔记----------