第六篇:spring实战-Spring文件上传MultipartFile
在构建网站是,处理文件上传功能是必须的,比如创建用户需要用户上传头像,创建服务器列表需要上传Excel文件等等
在Springmvc中对文件上传做了比较好的支持,同时支持基于Servlet3.0的标准multipart请求(StandardServletMultipartResolver),也支持基于Jakarta的Commons FileUpload(CommonsMultipartResolver)
下面主要展示标准Servlet3.0支持的方式,也推荐这种方式
1,需要在TilesWebConfig中配置MultipartResolver
/**
* 使用以来servet3.0的标准multipart解析器
* @return
*/
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
2,需要在IdatWebAppInitializer中配置MultipartConfigElement
/**
* 设置Servlet支持文件上传
* 并且上传的文件保存临时路径在/tmp/idat/uploads路径下面
* 单个文件大小不超过2M,一次上传所有文件大小总和不超过4M,0表示文件个数不限
* 如果文件大小超过限制,则会保存到临时路径下
*/
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(new MultipartConfigElement("d:/idat/uploads",2097152,4194304,0));
super.customizeRegistration(registration);
}
3,文件上传表单form支持multipart/form-data
<form:form method="POST" commandName="interface" enctype="multipart/form-data">
<form:errors path="*" element="div" cssClass="errors"></form:errors>
<table>
.......
<tr>
<td>logo</td>
<td><input type="file" name="logo" /></td>
</tr>
</table>
<input type="submit" value="create" />
</form:form>
4,处理控制器,接受并处理MultipartFile
/**
* 直接接受对象类型Interface 作为入参
* form表单中input的属性name和Interface的属性一一对应
* 注解@Valid启用校验功能,会按着Interface中属性的校验规则来校验入参
* 需要住的是后面的Errors参数需要紧跟@Valid注解的变量后面,error返回该校验参数的校验结果
* 但是如果希望Valid生效,还需要hibernate-validator包,或者同类实现Java Validation API的包
* @param intf
* @return
* @throws FileNotFoundException
*/
@RequestMapping(value = "/create", method=RequestMethod.POST)
public String create(@Valid Interface intf, Errors errors, @RequestPart("logo") MultipartFile logo) throws IOException{
// 如果校验不通过的话,返回创建表单页面
if (errors.hasErrors()) {
return "createForm";
}
String originalFilename = logo.getOriginalFilename();
FileOutputStream fileOutputStream = new FileOutputStream("d:/idat/"+originalFilename);
fileOutputStream.write(logo.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
Interface rintf = idatService.save(intf);
// 当视图解析器遇到 redirect:时,把他解析为重定向的规则,还有一个forward:
// 具体redirect 和 forward 的区别 请参考 http://blog.youkuaiyun.com/tidu2chengfo/article/category/6993805
return "redirect:queryInterfacesByName/" + rintf.getName() + "/intf";
}
至此,我们便完成了从客户端向服务器上传提交文件