在做springmvc文件上传的时候通常都会用这种方法获得上传的文件数据
//desc,file是页面上标签的id属性
@RequestMapping(value="/testUpload",method=RequestMethod.POST)
public String testUpload(@RequestParam(value="desc",required=false) String desc, @RequestParam("file") MultipartFile multipartFile) throws IOException{
System.out.println("desc : "+desc);
System.out.println("OriginalFilename : "+multipartFile.getOriginalFilename());
InputStream inputStream = multipartFile.getInputStream();
System.out.println("inputStream.available() : "+inputStream.available());
System.out.println("inputStream : "+inputStream);
return "success";
}
但是就我所知
@RequestParam是将请求参数映射到请求处理方法的形参中
常用来处理简单类型的绑定,用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。
可是文件上传的时候Content-Type:为multipart/form-data,那么为什么此时@RequestParam可以得到文件数据,我个人的理解是MultipartFile 的原因,可能是因为springmvc的文件上传解析器起的作用,但是我还是没理解怎么做到的
可以认为@RequestParam也可以处理multipart/form-data吗。
如果看下spring的源码会发现,spring在参数处理的时候会把Content-Type解析为MediaType,然后由spring框架中注册的具体RequestBodyAdviceAdapter来处理,不同的Content-Type会对应不同的RequestBodyAdviceAdapter。这个实现类实现了对上传文件的解析。