Spring MVC文件上传
Spring MVC 框架的文件上传基于 commons-fileupload 组件,并在该组件上做了进一步的封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。
1. MultipartResolver接口
在 Spring MVC 中实现文件上传十分容易,它为文件上传提供了直接支持,即 MultpartiResolver 接口
MultipartResolver 用于处理上传请求,将上传请求包装成可以直接获取文件的数据,从而方便操作
MultpartiResolver 接口有以下两个实现类:
-
StandardServletMultipartResolver: 使用了 Servlet 3.0 标准的上传方式
-
CommonsMultipartResolver: 使用了 Apache 的 commons-fileupload 来完成具体的上传操作
MultpartiResolver 接口具有以下方法:
名称 | 作用 |
---|---|
byte[] getBytes() | 以字节数组的形式返回文件的内容 |
String getContentType() | 返回文件的内容类型 |
InputStream getInputStream() | 返回一个InputStream,从中读取文件的内容 |
String getName() | 返回请求参数的名称 |
String getOriginalFillename() | 返回客户端提交的原始文件名称 |
long getSize() | 返回文件的大小,单位为字节 |
boolean isEmpty() | 判断被上传文件是否为空 |
void transferTo(File destination) | 将上传文件保存到目标目录下 |
使用 CommonsMultipartResolver 来完成文件上传,
分为单文件上传和多文件上传两部分介绍
2. 文件上传
2.1 maven引入
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
2.2 配置 MultipartResolver
使用 CommonsMultipartReslover 配置 MultipartResolver 解析器,在 springmvc.xml 中添加代码如下:multipartResolver
<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
二选一
@Bean("multipartResolver") //名称为固定multipartResolver
public CommonsMultipartResolver multipartResolver2(){
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");
resolver.setMaxUploadSize(500000);
return resolver;
}
- defaultEncoding: 请求的编码格式,默认为 ISO-8859-1,此处设置为 UTF-8
(注:defaultEncoding 必须和 JSP 中的 pageEncoding 一致,以便正确读取表单的内容) - maxUploadSize: 上传文件大小上限,单位为字节
2.3 编写文件上传表单页面
负责文件上传表单的编码类型必须是“multipart/form-data”类型。
2.4 上传页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file01"><br/>
<input type="submit" value="上传">
</form>
</body>
</html>
2.5 编写控制器
测试:
@Controller
public class UploadController {
@GetMapping("/upload")
public String get(){
return "upload";
}
@PostMapping("/upload")
@ResponseBody
public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
//String Path = req.getRealPath(".");
//找到文件存储的位置
String path = req.getSession().getServletContext().getRealPath(".");
return "ok";
}
}
debug测试: 测试运行试一下:
存储文件:controller中编写
@PostMapping("/upload")
@ResponseBody
public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
//String Path = req.getRealPath(".");
//找到文件存储的位置
String path = req.getSession().getServletContext().getRealPath(".");
//获取文件名字
String name=file01.getOriginalFilename();
//transferTo方法将上传文件写到服务器上指定的文件;
file01.transferTo(new File(path,name));
return "ok";
}
也可以把路径写死:
file01.transferTo(new File("D:\\206",name));
加入图片uuid随机生成名字:
String name= IdUtil.fastSimpleUUID()+"-"+file01.getOriginalFilename();
加入判断防止用户恶意测试:
if(file01.isEmpty()){
return "请选择文件";
}
代码修改:
@PostMapping("/upload")
@ResponseBody
public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
if(file.isEmpty()){
return "请选择文件";
}
//String Path = req.getRealPath(".");
//找到文件存储的位置
String path = req.getSession().getServletContext().getRealPath(".");
//获取文件名字
String name = IdUtil.fastSimpleUUID()+"_"+ file.getOriginalFilename();
//transferTo方法将上传文件写到服务器上指定的文件;
file01.transferTo(new File(path,name));
return "ok";
}
配置类中配置:
@Bean
public CommonsMultipartResolver multipartResolver(){
CommonsMultipartResolver resolver=new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");
resolver.setMaxUploadSize(5000000);
return resolver;
}