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;
}
}
@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";
}
}
二:文件下载
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);
}