文件上传之SpringMVC

本文介绍如何使用Spring MVC框架实现文件上传功能。通过配置MultipartResolver并利用Commons-fileupload组件,可以轻松处理HTTP请求中的多部分数据。文章还提供了前端表单及后端处理的具体示例。
Spring已经为我们提供了一个MultipartResolver的实现,我们只需要拿来用就可以了,
那就是org.springframework.web.multipart.commons.CommsMultipartResolver。
因为springMVC的MultipartResolver底层使用的是Commons-fileupload,
所以还需要加入对 Commons-fileupload.jar 的支持。

如果你想使用springMVC对文件上传的解析器来处理文件上传的时候就需要在
spring的applicationContext里面加上springMVC提供的MultipartResolver的申明。
这样之后,客户端每次进行请求的时候,springMVC都会检查request里面是否包含多媒体信息,
如果包含了就会使用MultipartResolver进行解析,springMVC会使用一个支持文件处理的
MultipartHttpServletRequest来包裹当前的HttpServletRequest,
然后使用MultipartHttpServletRequest就可以对文件进行处理了。

第一步
需要在applicationContext.xml文件中引入如下配置:

<!-- 多部分文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    
	<!--设置允许上传的最大文件大小,以字节为单位计算。
		当设为-1时表示无限制,默认是-1  -->
	<property name="maxUploadSize" value="104857600" />
     
	<!--设置在文件上传时允许写到内存中的最大值,
		以字节为单位计算,默认是10240  --> 
	<!-- <property name="maxInMemorySize" value="4096" /> -->

	<!--属性启用是为了推迟文件解析,以便在UploadAction中捕获文件大小异常 -->  
    <!-- <property name="resolveLazily" value="true"/> -->

	<!-- 设置上传文件时的临时目录,默认是Servlet容器的临时目录 -->
	<!--<property name="uploadTempDir" value=""/>-->   

	<!--表示用来解析request请求的默认编码格式,
		当没有指定的时候根据Servlet规范会使用默认值ISO-8859-1。
		当request自己指明了它的编码格式的时候就会忽略这里指定的defaultEncoding -->
    <!-- <property name="defaultEncoding" value="UTF-8"></property> -->
    
</bean>

前端页面
注意:form表单必须加上enctype=“multipart/form-data”

	<!--需要引入jquery 大家根据自己的路径引入-->
	<script type="text/javascript" src="jquery.min.js"></script>
	<form name="frm" id="frm" action="/demoAdmin/addFile" method="post" enctype="multipart/form-data"> 
			<input type="file" name="file1"   />
			<input type="file" name="file2"   />
			
			<!--	如果不需要异步 这里直接写submit按钮就可以 -->
			<!-- <input type="submit"  value="上传" /> -->
			
			<!---点该按钮 异步提交-->
			<input type="button" onclick="upLoad();"  value="上传" />

	</form>
	
<script type="text/javascript" >

	//提交方法
	function upLoad(){
		
			//获取表单方式一: 这种方式是获取第一个表单
			//var formData = new FormData($('form')[0]);
			
			//获取表单方式二:这种方式是得到name属性为frm的第一个表单元素
			//var solform=$("form[name='frm']")[0];
			//var formData= new FormData(solform);
			
			//获取表单方式三:这种是先得到所有表单,然后再遍历找到你需要的表单
			var formData =null;
			var fs=$('form');//得到所有表单
			for(var i=0;i<fs.length;i++){//遍历
				if(fs[i].id=="frm"){//匹配表单id为frm的表单
					formData= new FormData(fs[i]);//实例对象
				}
			}
			
		    $.ajax({
		        url: '/demoAdmin/addFile',//请求路径
		        type: 'POST',//提交方式
		        success: function(data){//成功方法
		        	
		        	//判断返回success表示成功
		        	if("success"==data){
		        		
		        	}else{//否则失败
		        		
		        		zzrw.alert("操作失败");
		        	}
		        	
			    },error:function(){//请求失败方法
			    	
			    	zzrw.alert("系统繁忙,请稍后再试!");
			    },
			    
			    data:formData,// Form表单数据
		        //设置jQuery不处理数据或担心的内容类型
		        cache: false,
		        contentType: false,
		        processData: false
		    });
	}

</script>

后台处理方式一:

	import org.springframework.web.bind.annotation.RequestMapping;
	import org.springframework.web.bind.annotation.ResponseBody;
	import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;
	import java.util.Iterator;
	import javax.servlet.http.HttpServletRequest;
	import org.springframework.web.multipart.MultipartFile;
	import java.io.File;
	
	/**
	 * 保存文件
	 * @param name 文件新的名称
	 * @param request
	 * @return
	 */
	@RequestMapping(value = "addFile")
	@ResponseBody
	public String addFile(String name, HttpServletRequest request) {
		
		String result = "error";
		
		DefaultMultipartHttpServletRequest MultipartRequest = (DefaultMultipartHttpServletRequest) request;
		
		Iterator<String> iter = MultipartRequest.getFileNames();//得到所有文件
		
		String loadUrl="d://file";//上传路径
		try {
			
			//判断下一个文件不为空,如果有多个可使用while循环遍历
			if (iter.hasNext()) {
			
				//得到当前文件
				MultipartFile file = MultipartRequest.getFile(iter.next());
				
				//得到文件名称
				String fileName = file.getOriginalFilename();
				
				//得到文件后缀
				String lastname = fileName.substring(fileName.lastIndexOf("."));

				//构建新的文件名
				String newfileName=name+lastname;
				
				// 创建文件对象,第一个参数是文件夹目录,第二个参数是文件名称
				File target = new File(loadUrl,newfileName);
				
				//判断是否存在
				if (!target.exists()) {
						target.mkdirs();//不存在则创建
				}
				
				file.transferTo(target);//上传文件
					
				result="success";//表示成功
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

后台处理方式二:

	import org.springframework.web.bind.annotation.RequestMapping;
	import org.springframework.web.bind.annotation.RequestParam;
	import org.springframework.web.bind.annotation.ResponseBody;
	import org.springframework.web.multipart.MultipartFile;
	import javax.servlet.http.HttpServletRequest;
	import java.io.File;
	
	/**
	 * 保存文件
	 * @param name  文件名称
	 * @param file1 文件1
	 * @param file2 文件2
	 * @return
	 */
	@RequestMapping(value = "addFile")
	@ResponseBody
	public String saveOrUpdateOK(String name, @RequestParam("file1") MultipartFile file1,
	@RequestParam("file2") MultipartFile file2,HttpServletRequest request) {
		String result="error";
		try{
				//判断文件1不为空
				if(!file1.isEmpty()) {
					
					//得到文件1名称
					String fileName1 = file1.getOriginalFilename();
					
					//得到文件1后缀名
					String lastname1=fileName1.substring(fileName1.lastIndexOf("."));
			
					//构建新的文件名
					fileName1=name+"1"+lastname1;
					
					//创建文件对象,第一个参数是文件夹目录,第二个参数是文件名称
					File target1 = new File("D:file",fileName1);
					
					//判断目录是否存在 
					if(!target1.exists()){
						target1.mkdirs();//不存在则创建
					} 
					
					file1.transferTo(target1);//上传
				
				}
				
				//判断文件2不为空
				if(!file2.isEmpty()) {
					
					//得到文件2名称
					String fileName2 = file2.getOriginalFilename();
					
					//得到文件2后缀名
					String lastname2=fileName2.substring(fileName2.lastIndexOf("."));
			
					//构建新的文件名
					fileName2=name+"2"+lastname2;
					
					//创建文件对象,第一个参数是文件夹目录,第二个参数是文件名称
					File target2 = new File("D:file",fileName2);
					
					//判断目录是否存在 
					if(!target2.exists()){
						target2.mkdirs();//不存在则创建
					} 
					
					file2.transferTo(target2);//上传
					
				}
			
			result="success";//表示成功
			
		}catch(Exception e){
			e.printStackTrace();
		}
		return result;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值