本文介绍了在springmvc中实现上传功能的三种方式,下面介绍代码部分:
前台Jsp:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form id="itemForm"
action="${pageContext.request.contextPath }/product/add3.do"
method="post" enctype="multipart/form-data">
<table width="100%" border="0">
<tr>
<td width="200px">姓名:</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td><input type='file' name='myfiles' /></td>
<td><input type='file' name='myfiles' /><font color="red">请上传图片的大小不超过3MB</font></td>
</tr>
<tr>
<td colspan="2" align="left"><input type="submit" value="提交" /></td>
</tr>
</table>
</form>
</body>
</html>
配置文件applicationContext.xml:
<!-- 文件的上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置编码格式,默认为iso-8859-1 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 为了测试时速,指定所上传文件的总大小不能超过1GB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="1073741824" />
</bean>
后台Controller:
第一种方式:
/*
* 通过IO流的方式上传文件
* @RequestParam("myfiles") 将name=myfiles控件得到的文件封装成MultipartFile数组对象
*/
@RequestMapping("add1")
public String add1(@RequestParam("myfiles") MultipartFile[] myfiles,
HttpServletRequest request)
throws IllegalStateException, IOException {
// 记录开始时间
long startTime = System.currentTimeMillis();
for (MultipartFile file : myfiles) {
if (file.isEmpty()) {
//此文件域未进行上传
} else {
//设置文件路径
String realPath = request.getServletContext()
.getRealPath("update1");
//如果文件夹不存在,创建新的文件夹
File upload_dir = new File(realPath);
if (!upload_dir.isDirectory() && !upload_dir.isFile()) {
upload_dir.mkdir();
System.out.println("文件夹创建成功");
}
//获取输出流, 文件名改为为当前时间+原始文件名.扩展名
OutputStream outputStream = new FileOutputStream(realPath + "/"
+ new Date().getTime() + file.getOriginalFilename());
//利用MultipartFile中.getInputStream()方法获取输入流
InputStream inputStream = file.getInputStream();
//读取并写入
int temp = 0;
byte[] by = new byte[1024];
while ((temp = inputStream.read(by)) != -1) {
outputStream.write(by, 0, temp);
}
//回收资源
inputStream.close();
outputStream.close();
}
}
long endTime = System.currentTimeMillis();
System.out.println("第一种方式的运行时间:" + String.valueOf(endTime - startTime)
+ "ms");
return "redirect:list.do";
}
第二种方式:
/*
* 利用MultipartFile中的transferTo()方法进行上传
*/
@RequestMapping("add2")
public String add2(@RequestParam("myfiles") MultipartFile[] myfiles,
HttpServletRequest request)
throws IllegalStateException, IOException {
long startTime = System.currentTimeMillis();
for (MultipartFile file : myfiles) {
if (file.isEmpty()) {
//此文件域未进行上传
} else {
//设置文件路径
String realPath = request.getSession().getServletContext()
.getRealPath("/update2");
//如果文件夹不存在,创建新的文件夹
File upload_dir = new File(realPath);
if (!upload_dir.isDirectory() && !upload_dir.isFile()) {
upload_dir.mkdir();
System.out.println("文件夹创建成功");
}
// 把文件上传至path的路径,文件名改为为当前时间+原始文件名.扩展名
File localFile = new File(realPath + "/" + new Date().getTime()
+ file.getOriginalFilename());
file.transferTo(localFile);
}
}
long endTime = System.currentTimeMillis();
System.out.println("第二种方式的运行时间:" + String.valueOf(endTime - startTime)
+ "ms");
return "redirect:list.do";
}
第三种方式:
/*
* 利用spring提供的上传方法
*/
@RequestMapping("add3")
public String add3(HttpServletRequest request)
throws IllegalStateException, IOException {
long startTime = System.currentTimeMillis();
// 创建CommonsMultipartResolver对象
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
// 检查form中是否有enctype="multipart/form-data"
if (multipartResolver.isMultipart(request)) {
// 设置文件路径
String realPath = request.getSession().getServletContext()
.getRealPath("/update3");
// 如果文件夹不存在,创建新的文件夹
File upload_dir = new File(realPath);
if (!upload_dir.isDirectory() && !upload_dir.isFile()) {
upload_dir.mkdir();
System.out.println("文件夹创建成功");
}
// 将request变成MultipartHttpServletRequest
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 通过multiRequest获取MultipartFile对象集合
List<MultipartFile> files = multiRequest.getFiles("myfiles");
for (MultipartFile file : files) {
if (file.getSize() != 0) {
// 把文件上传至path的路径,文件名改为为当前时间+原始文件名.扩展名
File localFile = new File(realPath + "/" + new Date().getTime()
+ file.getOriginalFilename());
file.transferTo(localFile);
}
}
}
long endTime = System.currentTimeMillis();
System.out.println("第三种方式的运行时间:" + String.valueOf(endTime - startTime)
+ "ms");
return "redirect:list.do";
}
现在分别对三种方式进行测试
一、上传两个文档,总大小为1.81MB
运行结果:
二、上传一个视频,总大小为964 MB
运行结果: