1.添加依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
2.配置web.xml
<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="500000"/>
<property name="defaultEncoding" value="UTF-8"/>
<!-- defaultEncoding:请求的编码格式,默认为 ISO-8859-1,此处设置为 UTF-8(
注:defaultEncoding 必须和 JSP 中的 pageEncoding 一致,以便正确读取表单的内容)。-->
<!-- maxUploadSize:上传文件大小上限,单位为字节。-->
</bean>
3.jsp页面:
基于表单的文件上传需要使用 enctype 属性,并将它的值设置为 multipart/form-data,同时将表单的提交方式设置为 post。
表单的 enctype 属性指定的是表单数据的编码方式,该属性有以下 3 个值:
* application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的 value 属性值。
* multipart/form-data:该编码方式以二进制流的方式来处理表单数据,并将文件域指定文件的内容封装到请求参数里。
* text/plain:该编码方式只有当表单的 action 属性为“mailto:”URL 的形式时才使用,主要适用于直接通过表单发送邮件的方式。
单个文件上传:
实体类:
控制层:
package com.openlab.controller;
import com.openlab.bean.FileDomain;
import com.openlab.bean.MultiFileDomain;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;
@Controller
public class FileUploadController {
// 得到一个用来记录日志的对象,这样在打印信息时能够标记打印的是哪个类的信息
private static final Log logger = LogFactory.getLog(FileUploadController.class);
@RequestMapping("getFileUpload")
public String getFileUpload() {
return "fileUpload";
}
/**
* 单文件上传
*/
@RequestMapping("/fileupload")
public String oneFileUpload(@ModelAttribute FileDomain fileDomain, HttpServletRequest request) {
/*
* 文件上传到服务器的位置“/uploadfiles”,该位置是指 workspace\.metadata\.plugins\org.eclipse
* .wst.server.core\tmp0\wtpwebapps, 发布后使用
*/
//Application作用域
String realpath = request.getServletContext().getRealPath("/upload");
/*
临时路径 D:\IDEA项目\Spring-MVC-\SPRING-MVC-annotation\target\SPRING-MVC-annotation-1.0-SNAPSHOT\upload
*/
System.out.println(realpath);
// String path="D:";
/*
上传到本地磁盘
*/
//UUID.randomUUID()防止文件重名
String fileName = fileDomain.getMyfile().getOriginalFilename();
File targetFile = new File(realpath, fileName);
System.out.println(targetFile);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
// 上传
try {
fileDomain.getMyfile().transferTo(targetFile);
logger.info("成功");
} catch (Exception e) {
e.printStackTrace();
}
return "showFile";
}
@RequestMapping("/getmultiFile")
public String getmultiFile() {
return "multiFiles";
}
上传成功展示层:
文件描述:${fileDomain.description }
<!-- fileDomain.getMyFile().getOriginalFilename()-->
文件名称:${fileDomain.myfile.originalFilename }
多个文件上传:
步骤:
实体类:
控制层:
/**
* 多文件上传
*/
@RequestMapping("/multifile")
public String multiFileUpload(@ModelAttribute MultiFileDomain multiFileDomain, HttpServletRequest request) {
String realpath = request.getServletContext().getRealPath("uploadfiles");
File targetDir = new File(realpath);
if (!targetDir.exists()) {
targetDir.mkdirs();
}
List<MultipartFile> files = multiFileDomain.getMyfile();
System.out.println("files"+files);
for (int i = 0; i < files.size(); i++) {
MultipartFile file = files.get(i);
String fileName = file.getOriginalFilename();
File targetFile = new File(realpath, fileName);
// 上传
try {
file.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
}
return "showMulti";
}
}
jsp页面:
<form action="${pageContext.request.contextPath}/multifile" method="post" enctype="multipart/form-data">
选择上传文件1: <input type="file" name="myfile"/>
文件描述1:<input type="text" name="description">
选择上传文件2: <input type="file" name="myfile"/>
文件描述2:<input type="text" name="description">
选择上传文件3: <input type="file" name="myfile"/>
文件描述3:<input type="text" name="description">
<input type="submit" value="提交"/>
</form>
上传成功展示页面:
<table border="1px">
<tr>
<td>详情</td>
<td>文件名</td>
</tr>
<!-- 同时取两个数组的元素 -->
<c:forEach items="${multiFileDomain.description}" var="description"
varStatus="loop">
<tr>
<td>${description}</td>
<td>${multiFileDomain.myfile[loop.count-1].originalFilename}</td>
</tr>
</c:forEach>
<!-- fileDomain.getMyfile().getOriginalFilename() -->
</table>