SpringMVC会根据请求方法签名的不同,将请求消息中的信息以一定的方式转换并绑定到请求方法的参数中。在请求消息到达真正调用处理方法的这段时间内,SpringMVC还会完成很多其他的工作,包括请求消息转换、数据转换、数据格式化以及数据校验。
一:SpringMVC实现文件上传
为了实现文件上上传,必须将表单的method设置为POST,并将enctype设置为multipart/form-data,在这种情况下浏览器会把用户选择的文件二进制数据发送给服务器。SpringMVC为文件上传提供了直接的支持,用即插即用的MultipartResolver实现,因此SpringMVC的文件上传组件还需要依赖Apache Commons FileUpload的组件。
<!-- 文件上传组件 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
案例:SpringMVC的文件上传
1、在SpringMVC.xml文件中添加Bean文件
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--上传文件大小限制 单位为字节(10M)--> <property name="maxUploadSize"> <value>10485760</value> </property> <!--请求的编码格式 必须和jsp的pageEncoding属性一致 以便正确读取表单的内容 默认为IS0-8859-1 --> <property name="defaultEncoding"> <value>UTF-8</value> </property> </bean>
2、编写jsp页面 分别是registerForm.jsp、userInfo.jsp、error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用户注册</title> </head> <body> <h2>用户注册</h2> <form action="register" enctype="multipart/form-data" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>请上传图片:</td> <td><input type="file" name="image"/></td> </tr> <tr> <td><input type="submit" name="注册"/></td> </tr> </table> </form> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h2>文件下载</h2> <a href="download?filename=${requestScope.user.image.originalFilename}"> ${requestScope.user.image.originalFilename} </a> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 错误页面 </body> </html>
3、Controller类
@RequestMapping("/register") public String register(HttpServletRequest request, @ModelAttribute User user, Model model)throws Exception{ if(!user.getImage().isEmpty()){ /**上传文件的路径*/ String path = request.getSession().getServletContext().getRealPath("/images/"); System.out.println(path); /**上传文件名*/ String filename = user.getImage().getOriginalFilename(); File filepath = new File(path,filename); /**判断路径是否存在 不存在则创建*/ if(!filepath.getParentFile().exists()){ filepath.getParentFile().mkdirs(); } /**将上传文件保存带目标文件中*/ user.getImage().transferTo(new File(path+File.separator+filename)); /**将用户添加到model*/ model.addAttribute("user",user); /**跳转*/ return "userInfo"; }else{ return "error"; } }
package com.jz.demo; import org.springframework.web.multipart.MultipartFile; public class User { private String username; private MultipartFile image; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public MultipartFile getImage() { return image; } public void setImage(MultipartFile image) { this.image = image; } }
二:文件下载
SpringMVC提供了一个ResponseEntity类型,使用它可以很方便的定义返回的HttpHeaders。
@RequestMapping(value="/download") public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model)throws Exception{ // 下载文件路径 String path = request.getSession().getServletContext().getRealPath( "/images/"); File file = new File(path+File.separator+ filename); HttpHeaders headers = new HttpHeaders(); // 下载显示的文件名,解决中文名称乱码问题 String downloadFielName = new String(filename.getBytes("iso-8859-1"),"UTF-8"); // 通知浏览器以attachment(下载方式)打开图片 headers.setContentDispositionFormData("attachment", downloadFielName); // application/octet-stream : 二进制流数据(最常见的文件下载)。 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 201 HttpStatus.CREATED return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); }