上传文件三要素:
我们知道,一般表单提交的参数都是很简单的,就是以“&”分割的name-value对,但是这种简单的编码形式只基本能满足基于文本的表单提交,对于传输二进制数据,类似文件上传等,就显的力不从心了,与之不同的是,multipart格式的数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域,一般表单输入域,其所对应的的部分是放置文本型数据,文件上传对应的是二进制,如:
可以看到在multipart请求中有一个Content-Type: application/octet-stream表示传输的二进制流,而不是简单的文本。
尽管multiaprt请求看起来比较麻烦,但这些在springMVC处理起来很容易,只需要配置一个multapart解析器,告诉DispatcherServlet如何读取multipart请求
spingmvc的 前端控制器DispatcherServlet并没有实现任何解析multipart请求数据的功能,他是通过Spring中的multipartResolver策略接口实现的,通过其实现类解析multipart请求中的内容,
从Spring3.1开始,spring内置了两个multipartresolver的实现类供我们选择:
CommonsMultipartResolver:使用Jakarta Commons FileUpload 解析multipart请求。
StandardServletMultipartResolver:依赖于servlet(3.0)对multipart请求的支持
StandardServletMultipartResolver使用的servlet所提供的功能支持,并不需要依赖jar包,
配置解析器:
@Bean
public MultipartResolver multipartResolver()throws IOException{
return new StandardServletMultipartResolver();
}
如果需要设置上传文件大小限制等相关参数,需要在Servlet中指定multipart的配置,也就是说需要在web.xml或servlet初始化类中对multipart进行属性配置(即在DispatchServlet中配置)。
在servlet初始化类中进行配置:
将文件上传临时路径设置为:/tmp/spittr/uploads
或者重载customizeRegistration() 方法(得到一个Dyamic作为参数)
或者直接在web.xml中进行配置:
处理multipart请求:
@Controller
@RequestMapping(value = "/file2")
public class FileController2 {
/**
* 在方法签名中使用MulitpartHttpServletRequest类型。
*
* @param request
* @return
*/
@RequestMapping(value = "/commUploadB")
@ResponseBody
public JSONObject commUploadB(MultipartHttpServletRequest request) {
JSONObject json = new JSONObject();
json.put("succ", false);
try {
MultipartFile file = request.getFile("uploadFileB");// 与页面input的name相同
File imageFile = new File("d:/upload2.jpg");// 上传后的文件保存目录及名字
file.transferTo(imageFile);// 将上传文件保存到相应位置
json.put("succ", true);
return json;
} catch (Exception e) {
e.printStackTrace();
return json;
}
}
/**
* 在方法签名中使用MultipartFile类型,并使用@RequestPart注解。
*
* @param uploadFileC
* @return
*/
@RequestMapping(value = "/commUploadC")
@ResponseBody
public JSONObject commUploadC(@RequestPart("uploadFileC") MultipartFile uploadFileC) {
JSONObject json = new JSONObject();
json.put("succ", false);
try {
File imageFile = new File("d:/upload3.jpg");// 上传后的文件保存目录及名字
uploadFileC.transferTo(imageFile);// 将上传文件保存到相应位置
json.put("succ", true);
return json;
} catch (Exception e) {
e.printStackTrace();
return json;
}
}
}
后一种类似:
当表单提交时profilePicture属性会给定一个byte数组,该数组中包含请求中对应part的数据,如果未上传文件该值为”“(不是null),
但是使用原始的byte上传文件比较简单且功能有限,不过,Spring还提供MultipartFile接口,它为处理multipart提供了丰富的对象:
transferTo(new File(“服务器路径”)),就可以将上传文件保存到服务器。
以part的形式接受上传的文件
注:part接口与multipartFile并没有太大的区别,但是如果使用Part参数形式接收文件上传,那就没必要配置multipartResolver了,只有使用multipartFile的时候才需要配置MultipartResolver,
write(“服务器路径”),就可以将上传文件保存到服务器。