上一篇是使用CommonsMultipartResolver的方式去处理文件上传的,下面来说说另一种方式StandardServletMultipartResolver
使用StandardServletMultipartResolver |
1.使用StandardServletMultipartResolver不需要依赖额外的包 |
推荐使用这种方式 |
2.在applicationContext.xml文件里配 置StandardServletMultipartResolver的bean |
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"> </bean>
|
3.在web.xml文件里配置multipart-config |
<!-- 上传文件-使用的bean为:StandardServletMultipartResolver时需要配置如下 --> <multipart-config> <location></location><!-- String类型 存放生成的文件地址,默认值为“”,文件地址是文件系统里的据对路径,它不支 持相对路径,所以一般不要配置它 --> <max-file-size>20848820</max-file-size> <max-request-size>418018841</max-request-size> <file-size-threshold>1048576</file-size-threshold> </multipart-config>
|
下面我们就可以写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; }
|
第三种:Part |
//import javax.servlet.http.Part;
@RequestMapping(value = "/uploadPart", method = RequestMethod.POST) public ModelAndView uploadPart(Part file, HttpServletRequest request) { ModelAndView mv = new ModelAndView(); mv.setView(new MappingJackson2JsonView()); String fileName = file.getSubmittedFileName(); String path = request.getSession().getServletContext().getRealPath("/") + "upload/"; try { File filePath = new File(path); if (!filePath.exists()) { filePath.mkdirs(); } path += fileName; file.write(path);// 也可以直接写其他路径file.write("E:/mvc/upload/"+fileName); mv.addObject("success", true); mv.addObject("msg", "上传文件成功!"); } catch (IllegalStateException | IOException e) { e.printStackTrace(); mv.addObject("success", false); mv.addObject("msg", "上传文件失败!"); } return mv; }
|
是的没错,如果你使用StandardServletMultipartResolver的方式后台有三种方式去处理文件上传的请求。
前两种既可以使用StandardServletMultipartResolver也可以使用CommonsMultipartResolver,但是Part只能使用StandardServletMultipartResolver的方式,因为Part需要配置web.xml里的multipart-config,当然我也尝试过CommonsMultipartResolver使用时去配置web.xml里的multipart-config,也是可行的。