看过之前的蜕变系列文章,相信你对springMVC有了一定的认识。对springMVC的异常处理,也有了一定的认识。今天我们来开启新讨论,讲一讲web开发中会经常遇到的一个功能,文件上传。
猿蜕变同样是一个原创系列文章,帮助你从一个普通的小白,开始掌握一些行业内通用的框架技术知识以及锻炼你对系统设计能力的提升,完成属于你的蜕变,更多精彩内容,敬请大家关注公主号猿人工厂,点击猿人养成获取!
文件上传这种小事情,我们自然不用担心啦。SpringMVC提供了强有力的支持,不会让你退化到使用request的inputStram的老路上去哒。一般来说,使用commons组件就轻松搞定啦。
我们在讲文件上传文件的功能之前,先做一点准备工作啦,我们先在webapp目录下创建一个名为upload的文件夹用于存放上传的文件。
然后,再编写一个文件上传的表单页面upload.jsp文件,增加一个表单即可。
<%@ page language="java" contentType="text/html;charset=utf-8"
pageEncoding="utf-8"isELIgnored="false"%>
注意:上传文件的表单需要在from标签中加入属性enctype="multipart/form-data",没有这个等待你的必然是,一顿操作猛如虎,抬头一看原地杵。
显示上传文件的页面showUpload.jsp
<%@ page language="java" contentType="text/html;charset=utf-8"
pageEncoding="utf-8"isELIgnored="false"%>
Spring MVC 文件上传样例
编写Controller代码
package com.pz.web.study.springmvc.controller;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class UploadFileControllerDemo {
@RequestMapping("/upload.do")
public String upload(MultipartFilepic,HttpServletRequest req,Model model) throws Exception {
if(!pic.isEmpty()) {
//获取服务器上传的文件路径
String path =req.getServletContext().getRealPath("/upload");
//获取文件名称
String filename =pic.getOriginalFilename();
//限制文件上传的类型
if ("image/png".equals(pic.getContentType())||"image/jpeg".equals(pic.getContentType())||"image/jpg".equals(pic.getContentType())) {
File file = new File(path, filename);
//完成文件上传
pic.transferTo(file);
model.addAttribute("path", "/upload"+"/"+filename);
return"showUpload";
}
}
return"../upload";
}
}
Spring MVC提供了MultipartFile类型来接收文件类型的参数,MultipartFile是一个接口,提供了一些操作文件的方法:
getOriginalFilename() 获取上传文件的文件名
isEmpty() 用于判断是否有文件上传,如果有文件上传返回true
getContentType() 获取上传文件类型
transferTo(File file) 将文件上传写入磁盘。
getName() 获取表单中input标签里的name属性值。
getBytes() 以byte数组的形式返回上传文件。
getInputStream() 返回上传文件的InputStram对象。
req.getServletContext().getRealPath("/upload")用于获取上传文件被存放的目录,其中getRealPath中的路径相对于应用的webapp目录算起的,不要搞错了噢。
修改pom.xml引入commons相关依赖:
修改spring-servlet.xml增加配置
启动应用,访问http://127.0.0.1/upload.jsp。蘑菇头,赶紧选择一张好看的图片,上传吧。
当上传的文件文件超出配置时指定的大小,应用程序会抛出异常——MaxUploadSizeExceededException。我们之前已经学习过SpringMVC的相关异常处理了,这里就不再重复讲了。
上传多个文件与单个文件最主要的区别是在于,Controller中接收文件的参数类型为MultipartFile的数组,即MultipartFile[] 并且需要加上annotation——@RequestParam。上传多个文件的页面input标记要设置相同的name属性值。我们看下面这个例子:
编写用于上传的jsp页面 uploadMultiFile.jsp
<%@ page language="java" contentType="text/html;charset=utf-8"
pageEncoding="utf-8"isELIgnored="false"%>
编写Controller代码,在UploadFileControllerDemo中新增方法
@RequestMapping("/uploadMultiFile.do")
public String uploadMultiFile(@RequestParam("pics") MultipartFile[] pics, HttpServletRequest req,
Model model) throws Exception {
if (null != pics || pics.length < 2) {
List
for (MultipartFile pic : pics) {
// 获取服务器上传的文件路径
String path =req.getServletContext().getRealPath("/upload");
// 获取文件名称
String filename =pic.getOriginalFilename();
// 限制文件上传的类型
if ("image/png".equals(pic.getContentType())
|| "image/jpeg".equals(pic.getContentType())
|| "image/jpg".equals(pic.getContentType())) {
File file = new File(path, filename);
// 完成文件上传
pic.transferTo(file);
paths.add("/upload" + "/" +filename);
}
}
model.addAttribute("paths", paths);
return"showUploadMultiFile";
}
return"../uploadMultiFile";
}
再次强调一下,@RequestParam("pics") MultipartFile[] 注意参数类型 和annotation的值,必须和页面input标记的name属性值匹配!
启动应用,访问http://127.0.0.1/uploadMultiFile.jsp,上传多个文件试试吧。
我建了一个群,群里有很多高手,欢迎大家入群探讨。