springMVC上传文件是通过MultipartResolver(Multipart解析器)处理的,对于MultipartResolver是一个接口,它有两个实现类
CommonsMultipartResolver |
依赖于Apache下的Jakarta Common FileUplode项目解析Multipart请求,可以在spring的各个版本中使用,只是它要依赖第三方实现包才得以实现 |
StandardServletMultipartResolver |
是spring3.1版本后的产物,它依赖于Servlet3.0或者更高版本的实现,它不需要依赖第三方包 |
你可以使用CommonsMultipartResolver上传文件,也可以使用StandardServletMultipartResolver上传文件,下面先以CommonsMultipartResolver这个解析器上传文件为例,来看看怎么去写。
使用CommonsMultipartResolver |
1.使用CommonsMultipartResolver时需要依赖两个包,你可以在pom.xml中加入这两个包的依赖
|
Apache的commons-io和commons-fileupload |
2.在applicationContext.xml文件里配置CommonsMultipartResolver的bean |
<!– 使用CommonsMultipartResolver它需要导入两个依赖包 –> <bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”> <!– 最大上传 –>
<property name=”maxUploadSize”> <value>104857600</value> </property>
<!– 读取文件到内存中最大的字节数,一般是1024 –> <property name=”maxInMemorySize”> <value>4096</value> </property> </bean>
|
下面我们就可以写controller去接收前台的文件提交请求了
前台:
前台页面 |
<form method=”post” action=”./uploadPart” enctype=”multipart/form-data”><!– 上传文件的提交编码类型要为multipart/form-data–> <input type=”file” name=”file” value=”请选择上传的文件”> <input type=”submit” value=”提交”> </form>
|
后台(可以有两种方式去处理文件上传的请求):
第一种:HttpServletRequest |
@RequestMapping(value = “/uploadFile”, method = RequestMethod.POST) public ModelAndView uploadFile(HttpServletRequest request) { //进行转换 MultipartHttpServletRequest msq = (MultipartHttpServletRequest) request; //获得请求上传的文件 MultipartFile file = msq.getFile(“file”);
ModelAndView mv = new ModelAndView(); mv.setView(new MappingJackson2JsonView());// 使返回结果为json格式 // 创建文件保存路径 String filename = request.getSession().getServletContext().getRealPath(“/”) + “upload/”;
// 判断保存路径是否存在,不存在则创建 mkdirs表示创建多层目录 mkdir只能创建一层 File dest = new File(filename); if (!dest.exists()) { dest.mkdirs(); } try { //获取原始文件名 filename += file.getOriginalFilename(); File actdest = new File(filename);//目标文件 //保存文件 file.transferTo(actdest); mv.addObject(“success”, true); mv.addObject(“msg”, “上传文件成功”); } catch (IllegalStateException | IOException e) { mv.addObject(“success”, false); mv.addObject(“msg”, “上传文件失败”); e.printStackTrace(); } return mv; }
|
第二种:MultipartFile |
@RequestMapping(value = “/uplodeFileMultipartFile”, method = RequestMethod.POST) public ModelAndView uplodeFileMultipartFile(MultipartFile file, HttpServletRequest request) { ModelAndView mv = new ModelAndView(); mv.setView(new MappingJackson2JsonView()); // 获取原始路径名 String fileName = file.getOriginalFilename(); file.getContentType(); // 配置存储文件路径 String path = request.getSession().getServletContext().getRealPath(“/”) + “upload/”; try { File filemkdirs = new File(path); if (!filemkdirs.exists()) { filemkdirs.mkdirs(); } path += fileName; File dest = new File(path); file.transferTo(dest); mv.addObject(“success”, true); mv.addObject(“msg”, “上传文件成功!”); } catch (IllegalStateException | IOException e) { e.printStackTrace(); mv.addObject(“success”, false); mv.addObject(“msg”, “上传文件失败!”); } return mv; }
|