Spring MVC的文件上传
文件上传功能在项目比较常用,如头像之类。一般来说,都是通过表单提交,设置method为post,enctype为multipart/form-data,此时浏览器会把文件以二进制流的形式发送给服务器。
Spring MVC的文件上传依赖于Apache Commons FileUpload组件,所以在使用上传功能时需要引入相关jar包(commons-fileupload.jar,commons-io.jar)。
1.页面uploadUI.jsp
注意method、enctype属性,否则无法上传文件
<form id="fileForm" action="${pageContext.request.contextPath}/file/upload.do" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>请选择文件</td>
<td><input type="file" name="upload"> </td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="上传">
</td>
</tr>
</table>
</form>
2.FileController.java
处理上传的文件,保存到指定位置
@Controller
@RequestMapping("/file")
public class FileController {
/**
* 上传文件页面
* */
@RequestMapping("/uploadUI")
public String uploadUI() throws Exception{
return "file/uploadUI";
}
/**
* 上传文件
* */
@RequestMapping("/upload")
public String upload(Model model, HttpServletRequest request,
@RequestParam("upload") MultipartFile upload) throws Exception{
String result = "error";
String message = "文件上传失败";
if(!upload.isEmpty()){
//获取绝对路径
String realpath = request.getServletContext().getRealPath("/uploads/file/");
//文件名
String filename = upload.getOriginalFilename();
//上传文件
upload.transferTo(new File(realpath, filename));
message = "文件上传成功";//提示信息
result = "success";//页面
}
//上传结果
model.addAttribute("message", message);
return result;
}
}
3.配置springmvc.xml
Spring MVC默认情况下不能处理文件上传,需装配解析器MultipartResolver;常用的属性defaultEncoding、maxUploadSize
<!-- 定义文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定编码,默认iso-8859-1 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
<property name="maxInMemorySize" value="4096" />
</bean>
4.部署到tomcat,选择文件上传
5.注:
(1).表单注意method="post",enctype="multipart/form-data"两个属性;
(2).文件上传通过MultipartFile类接收,常用方法:
byte[] getBytes();
String getContentType();
InputStream getInputStream();
String getName();
String getOriginalFilename();
long getSize();
boolean isEmpty();
void transferTo(File file);
(3).spring mvc上传文件不能通过配置文件对文件进行过滤,如文件格式,所以可以在Controller中对文件进行判断过滤;
(4).上传多个文件和单个文件类似,类似于checkbox,input的name属性相同即可,Controller处理方法中可通过数组或集合接收。