介绍
文本介绍上传文件
springmvc上传文件,是通过 commons-fileupload.jar、commons-io.jar 实现的,但是对其做了封装,使用起来更简单
Controller方法中,通过 MultipartFile 接口来处理文件上传
修改pom.xml
添加 commons-fileupload、commons-io 依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
修改 springMVC.xml
添加上传文件的解析器,该解析器通过 commons-fileupload 解析 mutipart 请求
可以设置上传文件大小
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760" />
<property name="maxInMemorySize" value="4096" />
<property name="defaultEncoding" value="utf-8" />
</bean>
解释:
maxUploadSize:允许上传最大大小,超过此值会报错maxInMemorySize:阈值,低于此值,只保留在内存里,超过此阈值,生成硬盘上的临时文件defaultEncoding:字符编码的设置,默认是ISO-8859
注意
id 必须是 multipartResolver,否则报错如下:
Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException: 由于没有提供multi-part配置,无法处理parts
html
<form method="post" enctype="multipart/form-data" action="student/upload">
上传图片:<input type="file" name="img"><br>
描述:<input type="text" name="descrip"><br>
<input type="submit">
</form>
注意
method="post"必须是post方法enctype="multipart/form-data":enctype 是表单请求正文的类型,上传文件必须设置,表示以 流 的方式将数据发送给服务器<input type="file" name="img">:上传文件控件,注意名字
Controller
@PostMapping("/upload")
public String upload(String descrip,MultipartFile img, HttpServletRequest req) {
System.out.println("描述:"+descrip);
if (img.isEmpty()){
return "needUploadFile";
}
/*
============将上传的文件,保存到 /webapp/upload/ 文件夹下
1. 获取 /webapp 文件夹路径
2. 拼装/upload 文件夹
3. 判断该文件夹是否存在,如果不存在就创建
*/
String contexPath= req.getSession().getServletContext().getRealPath("/");
File file=new File(contexPath,"upload");
if(!file.exists()) {
file.mkdirs();
}
//
/*
============修改文件名,防止上传的文件同名,导致覆盖
*/
//获取原文件名
String oFilename=img.getOriginalFilename();
//截取原文件名得后缀
String suffix=oFilename.substring(oFilename.lastIndexOf("."));
//拼装 uuid+原文件名得后缀
String newFilename= UUID.randomUUID().toString().replace("-","")+suffix;
File filePath=new File(file,newFilename);
try {
img.transferTo(filePath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "uploadSuccess";
}
注意:
MultipartFile img:表单上传文件控件的name属性,必须与img同名