这一节介绍SpringMVC对文件上传的支持,该功能支持需要使用到两个jar包:cmmons-fileupload-1.2.2.jar和commons-io-2.1.jar。
在controller类中添加输入参数MultipartFile,通过HttpServletRequest来获取文件拷贝的真实路径,对应代码如下所示:
@RequestMapping(value = "/add", method = RequestMethod.POST) public String add(@Validated Users user, BindingResult br,Model model, MultipartFile attach,HttpServletRequest req) throws IOException {// 一定要紧跟Validate之后写验证结果类 if (br.hasErrors()) { model.addAttribute("user", user); // 如果有错误直接跳转到add视图 return "user/add"; } String realpath = req.getSession().getServletContext().getRealPath("/resources/upload"); File f = new File(realpath+"/"+attach.getOriginalFilename()); FileUtils.copyInputStreamToFile(attach.getInputStream(),f); users.put(user.getUsername(), user); return "redirect:/user/users"; }
在前台页面添加input标签,设置type属性为file,并且把提交enctype属性值设置为multipart/format-data,对应add.jsp代码如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 此时没有写action,直接提交会提交给/add --> <!-- 将表单中的值添加到modelAttribute的属性值user中 --> <sf:form method="post" modelAttribute="user" enctype="multipart/form-data"> Username:<sf:input path="username"/><sf:errors path="username"/><br/> Password:<sf:password path="password"/><sf:errors path="password"/><br/> Nickname:<sf:input path="nickname"/><br/> Email:<sf:input path="email"/><sf:errors path="email"/><br/> Attach:<input type="file" name="attachs"/><br/> <input type="submit" value="添加用户"/> </sf:form> </body> </html>
在hello-servlet.xml文件中设置文件上传需要的multipartReslver,对应代码如下所示:
<!-- 设置multipartResolver才能完成文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="5000000"></property> </bean>
注:此处在前台add.jsp页面中上传文件的name属性值必须与controller类中的文件名对应的入参名称保持一致。
时间: 2024-10-08 00:00:49