SpringMVC 实现文件上传:
单文件上传:
SpringMVC 为文件上传提供了直接的支持, 即 MultipartResolver接口
MultipartResolver接口
用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作
两个实现类
StandardServletMultipartResolver : 使用了Servlet3.0标准的上传方式
CommonsMultipartResolver : 使用了Apache的commons-fileupload来完成具体的上传操作 ( 本篇以此)
省略了SpringMvc的配置:
- 导入 Jar文件
我们需要Apache 组件, 需要导入两个Jar 组件commons-io-2.4.jar
commons-fileupload-1.2.2.jar
- 配置MultipartResolver ( 在SpringMVC的核心配置文件中; )
使用CommonsMultipartResolver配置一个MultipartResolver解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="500000" ></property>
<property name="defaultEncoding" value="UTF-8" />
</bean>
<!--
defaultEncoding : 请求的编码格式,默认为 ISO-8859-1; 一般设为UTF-8 (defaultEncoding必须和JSP的pageEncoding 设置一致,以便正确读取表单内容)
maxUploadSize : 设置文件上传的大小限制,单位为字节;
-->
- 编写文件上传的表单页 (JSP HTML…)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!-- pageEncoding="UTF-8" 与MultipartResolver文件上传解析编码设置一致 -->
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<!--
action="myupload" : Springmvc控制器接收的名
method="post" : 提交方式,文件上传必须是 post; get存储太小了且不安全;
enctype="multipart/form-data" : 必须,指定表单内容类型,支持文件上传;
-->
<form action="myupload" method="post" enctype="multipart/form-data">
<p> <input type="text" name="name"> </p> <!-- 模拟上传人 -->
<p> <input type="file" name="myfile"> </p> <!-- 上传文件:用来上传文件的file组件 -->
</p> <input type="submit" value="上传"> </p> <!-- 提交 -->
</form>
</body>
</html>
- 编写控制器操作
@RequestMapping("/myupload")
public String myupload(String name,@RequestParam("myfile") MultipartFile myfile,HttpSession session) {
/*
* String name :页面给的用户名;
* @RequestParam("myfile") MultipartFile myfile :文件参数,@RequestParam 解决参数名不匹配,MultipartFile对象参数存储 上传文件的相关信息;
* HttpSession session :用于获取服务器 根路径;
*/
if(!myfile.isEmpty()){ //判断 文件是否存在,不存在则不做文件上传操作;
try {
//获取上传路径: path
//session.getServletContext() 获取服务器项目的根目录 .getRealPath("/myfile/"); 根目录下指定的文件,一般会在服务器中建一个文件专门存储上传的文件;
String path = session.getServletContext().getRealPath("/myfile/"); //获取当前要上传服务器的路径;
//上传的的文件名称: fileName
String fileName = System.currentTimeMillis()+myfile.getOriginalFilename();
File updatefile = new File(path, fileName); //IO文件操作,创建出对应的fileName文件名,放在对应的path目录下;
//执行上传: 上面只是在指定目录下创建出了一个空的文件 updatefile; 但里面啥也没有;
myfile.transferTo(updatefile); //将数据存在 指定的文件中;
} catch (Exception e) {
e.printStackTrace();
}
}
return "ok"; //返回页面;
}
/*MultipartFile类型:
* 常用方法:
* isEmpty(); 判断是否存在文件,true存在 false不存在 返回值 boolean
* getSize(); 获取当前文件上传大小,可以进行对应验证; 返回值 long 即:文件的单位 字节; 1024字节=1kb 1024kb=1Mb..
* getOriginalFilename(); 获取当前文件名,可用于获取文件后缀来来限制文件上传格式; 返回值 String
* transferTo(File); 参数文件类型,将指定的文件存在对应的 File 上;
* */
- 上传异常给予提示:
上面实例Demo 没有写~
大概思路:
控制器方法中存储一个 request ,如果上传过程中产生异常, 就往作用域中存一个 异常信息;
页面表单中有一个隐藏作用域:
< input type=“hidden” id=“xx” value="${作用存储异常信息}" />
之后页面function(){ } 方法页面加载事件:
$(function(){
//获取隐藏表单域对象; .val() 获取其值; (el表达式没有数据就是 null 原则…)
//判断 值!=null 则展示数据~!(这里展示的就是异常信息)
})
多文件上传:
多文件上传就比较简单咯~
代码改动不多, 表单加一个 File (毕竟要多上传一个文件呀~)
控制器 稍微微~ 修改即可;
表单:
<form action="myupload" method="post" enctype="multipart/form-data">
<p> <input type="text" name="name"> </p> <!-- 模拟上传人 -->
<p> <input type="file" name="myfile"> </p> <!-- 上传文件:用来上传文件的file组件 -->
<p> <input type="file" name="myfile"> </p> <!-- 上传文件:两个名字一样~ -->
</p> <input type="submit" value="上传"> </p> <!-- 提交 -->
</form>
控制器:
@RequestMapping("/myupload")
public String myupload(String name,@RequestParam("myfile") MultipartFile myfiles[],HttpSession session) {
//参数 MultipartFile myfile 变为一个数组 myfiles[]
//并使用 foreach 进行遍历~ ....就ok了我凑真简单~!
for (MultipartFile myfile : myfiles) {
if(!myfile.isEmpty()){ //判断 文件是否存在,不存在则不做文件上传操作;
try {
//获取上传路径: path
//session.getServletContext() 获取服务器项目的根目录 .getRealPath("/myfile/"); 根目录下指定的文件,一般会在服务器中建一个文件专门存储上传的文件;
String path = session.getServletContext().getRealPath("/myfile/"); //获取当前要上传服务器的路径;
System.out.println(path);
//上传的的文件名称: fileName
String fileName = System.currentTimeMillis()+myfile.getOriginalFilename();
File updatefile = new File(path, fileName); //IO文件操作,创建出对应的fileName文件名,放在对应的path目录下;
//执行上传: 上面只是在指定目录下创建出了一个空的文件 updatefile; 但里面啥也没有;
myfile.transferTo(updatefile); //将数据存在 指定的文件中;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return "ok"; //返回页面;
}
//System.currentTimeMillis() 获得系统的时间,单位为毫秒; + myfile.getOriginalFilename(); 文件名;
//为了防止文件重名异常问题~
ok ~