SpringMVC入门 (6) 文件上传
SpringMVC入门 (六) 文件上传
1.单个文件上传
在Controller的add方法中加入:
这里的MultipartFile就包含了上传文件的内容信息。
在add.jsp页面中加入文件上传:
这里直接上传文件会报错:
Expected MultipartHttpServletRequest: is a MultipartResolver configured?
因此我们需要在hello-servlet.xml中配置这个文件解析器
这里还没完, 打开CommonsMultipartResolver,可以看到
这里引用了commons-fileupload里面的类,因此我们还要导入commons-fileupload
2.多个文件上传
多文件上传的时候,首先要在add.jsp中加入多个file。
注意这里把attach改成了attachs
接下来修改Controller里的add方法:
这里做了两个改动,一个是把MultipartFile attach改成了
MultipartFile[] attachs,
另一个是在前面加入了 @RequestParam("attachs");这个注释可以将前台的parameter的名称和这里的参数捆绑起来:
1.单个文件上传
在Controller的add方法中加入:
@RequestMapping(value="/add",method=RequestMethod.POST) public String add(@Validated User user, BindingResult result, MultipartFile attach){ String realpath=req.getSession().getServletContext().getRealPath("/resources/upload"); File f=new File(realpath+"/"+attach.getOriginalFilename()); try { FileUtils.copyInputStreamToFile(attach.getInputStream(),f ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } users.put(user.getUsername(), user); return "redirect:/user/users"; }
这里的MultipartFile就包含了上传文件的内容信息。
在add.jsp页面中加入文件上传:
<body> <sf:form method="post" modelAttribute="user" enctype="multipart/form-data"> 用户名称:<sf:input path="username"/><sf:errors path="username"/><br/> 用户密码: <sf:input path="password"/><sf:errors path="password"/><br/> 用户昵称: <sf:input path="nickname"/> <br/> 用户邮箱: <sf:input path="email"/><sf:errors path="email"/><br/> 附件:<input type="file" name="attach"/><br/> <input type="submit" value="添加用户"/> </sf:form> </body>
这里直接上传文件会报错:
Expected MultipartHttpServletRequest: is a MultipartResolver configured?
因此我们需要在hello-servlet.xml中配置这个文件解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
这里还没完, 打开CommonsMultipartResolver,可以看到
/** * Initialize the underlying {@code org.apache.commons.fileupload.servlet.ServletFileUpload} * instance. Can be overridden to use a custom subclass, e.g. for testing purposes. * @param fileItemFactory the Commons FileItemFactory to use * @return the new ServletFileUpload instance */ @Override protected FileUpload newFileUpload(FileItemFactory fileItemFactory) { return new ServletFileUpload(fileItemFactory); }
这里引用了commons-fileupload里面的类,因此我们还要导入commons-fileupload
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3</version> </dependency>
2.多个文件上传
多文件上传的时候,首先要在add.jsp中加入多个file。
注意这里把attach改成了attachs
<body> <sf:form method="post" modelAttribute="user" enctype="multipart/form-data"> 用户名称:<sf:input path="username"/><sf:errors path="username"/><br/> 用户密码: <sf:input path="password"/><sf:errors path="password"/><br/> 用户昵称: <sf:input path="nickname"/> <br/> 用户邮箱: <sf:input path="email"/><sf:errors path="email"/><br/> 附件:<input type="file" name="attachs"/><br/> 附件:<input type="file" name="attachs"/><br/> 附件:<input type="file" name="attachs"/><br/> <input type="submit" value="添加用户"/> </sf:form> </body>
接下来修改Controller里的add方法:
@RequestMapping(value = "/add", method = RequestMethod.POST) public String add(@Validated User user, BindingResult result, @RequestParam("attachs") MultipartFile[] attachs, HttpServletRequest req) { for (MultipartFile attach : attachs) { String realpath = req.getSession().getServletContext() .getRealPath("/resources/upload"); File f = new File(realpath + "/" + attach.getOriginalFilename()); try { FileUtils.copyInputStreamToFile(attach.getInputStream(), f); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } users.put(user.getUsername(), user); return "redirect:/user/users"; }
这里做了两个改动,一个是把MultipartFile attach改成了
MultipartFile[] attachs,
另一个是在前面加入了 @RequestParam("attachs");这个注释可以将前台的parameter的名称和这里的参数捆绑起来:
/** * The name of the request parameter to bind to. */ String value() default "";)