本篇博客将讲解的是spring mvc的文件上传和下载功能。对于上传功能,我们在项目中是经常会用到的,比如用户注册的时候,上传用户头像,这个时候就会使用到上传的功能。而对于下载,使用场景也很常见,比如我们项目中有个使用说明是是pdf版的,会提供给用户进行下载的功能。
搭建spring mvc开发环境
一 配置文件上传下载
配置pom.xml:
<dependencies>
<!-- 文件上传下载 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>配置springmvc-mvc.xml:
<!-- 配置视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 文件上传下载 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件的最大大小 -->
<property name="maxUploadSize" value="17367648787"></property>
<!-- 上传文件的编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>二 实现文件上传的功能(所有jsp文件都放在/WEB-INF/page/)
2.1首先我们在新建一个jsp页面,命名为:upload.jsp,放在写一个上传的页面form表单,其中一定要注意的是在表单的属性中添加entcypt=”multipart/form-data”,这表示上传的将会是二进制流的格式,以规定的二进制进行上传,便于服务器处理,使用post请求:
<body>
<form action="upload" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>请选择文件:</td>
<td><input type="file" name="file"></td>
</tr>
<tr>
<td>开始上传</td>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>2.2 再写一个上传成功的jsp页面,主要是用来当上传成功时候跳转的页面,命名为:success.jsp
<body>
<h2>文件上传成功!</h2>
</body>2.3 然后再写一个上传失败的页面,主要是用来当上传失败的时候跳转的页面,命名为:error.jsp
<body>
<h2>文件上传失败!请检查文件是否存在</h2>
</body>2.4:写好了jsp页面,接下来就是写我们的控制器了,spring mvc控制器,在我们的com.imooc.mvcdemo中写一个FileUploadDownloadController类,然后写上具体的代码,如下所示,注意其中使用MultipartFile来接受form表单传过来的file文件,MultipartFile有几个核心的api,可以供我们使用,比如 boolean isEmpty(),用来判断文件是否为空。void transferTo( File file),把文件写入目标路径地址.
package com.imooc.mvcdemo;
@Controller
public class UploadDownloadController {
//文件存放位置
private final static String SAVE_FILE_PATH="E:\\spring_mvc\\imgs";
@RequestMapping(value = "/{formName}")
public String loginForm(@PathVariable String formName) {
return formName;
}
// 访问路径http://localhost:8080/spring_mvc/upload
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
if (!file.isEmpty()) {
// 存放我们上传的文件路径的文件名
String fileName = file.getOriginalFilename();
File filePathName = new File(SAVE_FILE_PATH, fileName);
if (!filePathName.getParentFile().exists()) {
filePathName.getParentFile().mkdirs();// 如果目录不存在,创建目录
}
try {
file.transferTo(filePathName);// 把文件路径的文件名写入目标文件地址
} catch (Exception e) {
return "error";// 返回到失败的页面
}
return "success";// 返回到成功页面
} else {
return "error";// 返回到失败的页面
}
}
}2.5:好了,到此我们就可以实现上传功能了,发布在Tomact容器里,然后就可以进行上传文件了。在浏览中输入:http://localhost:8080/spring_mvc/upload具体的页面请求如下,然后浏览具体的文件,点击上传按钮,选择好了文件,点击上传。
到了这一步还没完,我们再往下看,有没有写入目标文件夹,也就是在D:\userUploadFile\Files目录下看是否存在我的上传文件,查看是存在的也就是正确写入了

三:将上传文件绑定到具体的对象上
3.1:首先我们来定义一个实体类User,这个实体类中的headimage属性的主要作用就是用来映射我们上传的文件,可以看到它是MultipartFile类型的:
public class User implements Serializable {// 用户实体类
private String userName;
private MultipartFile headimage;// 上传文件会自动绑定到该属性
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public MultipartFile getHeadimage() {
return headimage;
}
public void setHeadimage(MultipartFile headimage) {
this.headimage = headimage;
}
}3.2:然后写我们的 jsp上传页面,这里我们来模拟一个用户注册上传头像的场景,新建一个registerForm.jsp页面,然后写一个form表单,如下:
<body>
<h2>用户注册</h2>
<form action="register" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>用户头像:</td>
<td><input type="file" name="headimage"></td>
</tr>
<tr>
<td>上传:</td>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>3.3:写我们的方法控制器处理注册逻辑的层的代码,注意其中的user对象加入了@ModelAttribute注解,其主要作用是用来映射把上面的form表单的headimage属性自动注入到对象里面,还有Map
// 访问路径http://localhost:8080/spring_mvc/register
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String reg(@ModelAttribute User user, HttpServletRequest request, Map<String, Object> map) {
MultipartFile headimage = user.getHeadimage();
boolean empty = headimage.isEmpty();
if (!empty) {
String headimageName = headimage.getOriginalFilename();
File filepath = new File(SAVE_FILE_PATH, headimageName);
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();// 如果目录不存在,创建目录
}
try {
headimage.transferTo(filepath);
} catch (Exception e) {
return "error";
}
map.put("user", user);
return "userInfo";
} else {
return "error";
}
}3.4:我们来新建一个jsp页面,取名为userInfo.jsp,其主要作用是显示刚才的我们的文件名:
<body>
用户头像:${requestScope.user.headimage.originalFilename}
</body>3.5:页面写完了,我们在来模拟测试一下,在客户端Ie浏览器中,输入http://localhost:8080/spring_mvc/register
四:实现用户下载的功能
4.1:首先我们来改造一下刚才的userInfo.jsp页面,主要目的是为了把它变成一个下载的连接,然后用我们就可以写我们的控制器用来处理href的请求来了。其中可以看到我们使用了el表达式把url传递给下一个控制器,控制器可以取出这些值进行处理:
<body>
<h3>文件下载</h3>
<a href="download?filename=${requestScope.user.headimage.originalFilename}">
用户头像:${requestScope.user.headimage.originalFilename}
</a>
</body>4.2:来看看我们的download控制器代码:注意download方法返回的是ResponseEntity
// 访问路径http://localhost:8080/spring_mvc/download/filename=girl.jpg
@RequestMapping(value="/download",method=RequestMethod.GET)
public ResponseEntity<byte[]> download(HttpServletRequest request,@RequestParam("filename") String filename, Model model) throws IOException{
String filenameStr=new String(filename.getBytes("iso-8859-1"),"UTF-8");//设置编码
File file = new File(SAVE_FILE_PATH,filenameStr);//新建一个文件
HttpHeaders headers = new HttpHeaders();//http头信息
headers.setContentDispositionFormData("attachment", filenameStr);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//MediaType:互联网媒介类型 contentType:具体请求中的媒体类型信息
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
}4.3:我们来测试一下写的东西是否能准确运行,点击超链接,注意此链接指向的地址:http://localhost:8080/spring_mvc/download?filename=xxxx,这就表示这个链接会去请求控制器,然后控制器进行处理下载, 这样就完成了文件的下载功能了
点击超链接进行下载
五:总结
本篇博文介绍了spring mvc上传和文件的功能,需要注意的地方就是对于文件上传包common-fileupload.jar包的使用,还有在配置文件上配置mulitipartResolver这个bean。下面又介绍了用java 实体类去映射上传文件的属性对应的文件,这点的好处就是它会自动映射,然后把对象放入到我们的请求域中,就可以展示给界面用户层,这也是mvc思想模式的体现。接下来是介绍去下载文件,只需要从我们的写入的目标地址去取出文件,再进行responseEntity对象的封装,就可以实现下载功能
参考资料
《spring+mybatis企业应用实战》
















