Spring MVC 框架的文件上传基于 commons-fileupload 组件,并在该组件上做了进一步的封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。
在 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 来完成文件上传,
分为单文件上传和多文件上传两部分介绍
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>2.11.0version>
dependency>
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>1.4version>
dependency>
使用 CommonsMultipartReslover 配置 MultipartResolver 解析器,在 springmvc.xml 中添加代码如下:multipartResolver
<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;
}
负责文件上传表单的编码类型必须是“multipart/form-data”类型。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file01"><br/>
<input type="submit" value="上传">
form>
body>
html>
测试:
@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;
}