SpringMVC 实现文件上传:

单文件上传:

SpringMVC 为文件上传提供了直接的支持, 即 MultipartResolver接口MultipartResolver接口

用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作
两个实现类
StandardServletMultipartResolver : 使用了Servlet3.0标准的上传方式
CommonsMultipartResolver : 使用了Apache的commons-fileupload来完成具体的上传操作 ( 本篇以此)


省略了SpringMvc的配置:

  1. 导入 Jar文件
    我们需要Apache 组件, 需要导入两个Jar 组件
    commons-io-2.4.jarcommons-fileupload-1.2.2.jar
  2. 配置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	: 设置文件上传的大小限制,单位为字节;
 -->
  1. 编写文件上传的表单页 (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>
  1. 编写控制器操作
@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 上;
	 * */
  1. 上传异常给予提示:
    上面实例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 ~