前台简单展示如下
<form name="Form2" action="${pageContext.request.contextPath}/bussiness/attendance/upload" method="post" enctype="multipart/form-data">
<h1>使用spring mvc提供的类的方法上传文件</h1>
单个文件:<input type="file" name="file" >
多个文件:<input type="file" name="file1" multiple >
<iput type="submit" value="上传"/>
</form>
选中之后是这样的:
需要注意的是, 要实现文件上传, form中必须指定属性enctype="multipart/form-data". method属性为"post"
前台就是这些基本的了,主要看后台:
首先SpringMVC配置文件中加这么一个bean
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
其中maxUploadSize属性用来设计上传文件的最大值, 单位是字节. 注意这里是总的上传限制, 比如设置为10M, 上传了4个3M的文件. 虽然单个文件都在10M以内, 但是总大小已经超过10M限制, 会抛出MaxUploadSizeExceededException异常
也可以在代码中直接创建对象
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
但是个人认为配置以后使用比较方便, 各位根据实际需要来。我是直接创建对象的
Service代码:
//文件上传
@Override
public List<String> upload(HttpServletRequest request) throws IllegalStateException, IOException {
List<String> list = new ArrayList<>();
//将当前上下文初始化给CommonsMultipartResolver(多部分解析器)
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//检查form中是否带有enctype="multipart/form-data"
if(multipartResolver.isMultipart(request)) {
//将request变成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
//获取multiRequest 中所有的文件名 <input>标签中的name属性
Iterator<String> fileNames=multiRequest.getFileNames();
while(fileNames.hasNext()) {
String fileName = fileNames.next();
/*
* multiRequest.getFiles(fileName)方法即通过fileName这个Key, 得到对应的文件
* 集合列表. 只是在这个Map中, 文件被包装成MultipartFile类型
*/
List<MultipartFile> fileList = multiRequest.getFiles(fileName);
if(fileList != null && fileList.size() > 0) {
//遍历文件列表
Iterator<MultipartFile> fileIte = fileList.iterator();
while(fileIte.hasNext()) {
//获得每一个文件
MultipartFile multipartFile = fileIte.next();
//定义文件存放路径
String realPath = request.getSession().getServletContext().getRealPath("/");
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
String str = "upload/" + multipartFile.getOriginalFilename();
String path1 = realPath + str; //保存到服务器地址
String path2 = basePath + str; //保存到项目根目录地址
//检查该路径对应的目录是否存在. 如果不存在则创建目录
File file = new File(path1);
if(!file.exists()) {
file.mkdirs();
}
multipartFile.transferTo(file);
list.add(path2);
}
}
}
}
System.out.println("=======================");
System.out.println(list);
System.out.println("=======================");
return list;
}
Controller代码:
/**
* 图片上传
* @param request
* @return
* @throws IllegalStateException
* @throws IOException
*/
@RequestMapping(value = "upload", method = RequestMethod.POST)
@ResponseBody
public AjaxRes springUpload(HttpServletRequest request) throws IllegalStateException, IOException {
AjaxRes ar = getAjaxRes();
try {
List<String> list = service.upload(request);
ar.setSucceed(list);
}catch (BussinessException e) {
ar.setFailMsg("文件上传失败");
}catch (Exception e) {
logger.error(e.toString(), e);
ar.setFailMsg("文件上传失败");
}
return ar;
}
备注:controller方法参数可以用 MultipartHttpServletRequest request 代替 HttpServletRequest request.
HttpServletRequest request使用更简洁