SpringMVC 上传文件(包含表单)的实现,含完整demo源码

现在回过头来仔细想想SpringMvc上传文件,真是很方便

下面我就简单的理一下整个过程吧

使用SpringMVC上传文件需要用到这两个jar包,文章结尾提供了免费的下载:

commons-fileupload-1.3.1.jar

commons-io-2.2.jar


首先需要在配置文件中配置 multipartResolver 上传文件解析器

可不用配置什么文件大小什么的,这个可以在前台进行处理,为了减轻服务器压力


<!-- 配置上传文件 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="UTF-8" />
</bean>

接着,一个简单的提交页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="js/public/jquery-1.11.3.js"></script>
<script type="text/javascript">
	function filesize() {
		var fileInput = $("#fileid")[0];
		byteSize = (fileInput.files[0].size / 1024).toFixed(2);
		alert(byteSize);
	}
	function upload() {
		
		var formData = new FormData($( "#formid" )[0]);  
	     $.ajax({  
	          url: "upload/file1.do" ,  
	          type: "POST",  
	          data: formData,  
	          async: false,  
	          cache: false,  
	          contentType: false,  
	          processData: false,  
	          success: function (returndata) {  
	              alert(returndata);  
	          },  
	          error: function (returndata) {  
	              alert(returndata);  
	          }  
	     });  
	}
</script>
<title>上传文件</title>
</head>
<body>
	<form id="formid">
		文件:<input type="file" id="fileid" name="filename" onchange="filesize();" /><br />
		姓名:<input type="text" id="userid" name="username" />
		密码:<input type="text" id="password" name="password" />
		<input type="button" id="buttonid" value="上传" onclick="upload();" />
	</form>
</body>
</html>

关于FormData 的一些简要说明,可以参考这里 :

SSH框架中struts2上传文件的实现,页面不跳转刷新,使用FormData进行Ajax请求

上面的代码中,当我们选择文件时,会执行一个filesize这个jquery方法,它会为我们计算当前这个文件的大小,并精确到小数点后两位,单位是KB。这样,我们就可以客户端验证文件大小,而不必在服务端去验证了。


最后是我们的控制器Controller


package com.springmvc.study.upload;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
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 org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import com.springmvc.study.json.listuser;

@Controller
@RequestMapping("/upload")
public class UpLoad {
	@RequestMapping("/file1")
	public @ResponseBody String getFile1(listuser users, HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{
		System.out.println(request.getParameter("username"));
		System.out.println(users.getUsername());
		
		//使用springmvc提供的方法来处理文件
		//初始化解析器
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
		
		//判断request中是否有multipartResolver类型数据,有就表示有文件类型
		if(multipartResolver.isMultipart(request)){
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
			
			//获得文件名,这里是迭代器封装
			Iterator iter = multiRequest.getFileNames();
			while(iter.hasNext()){
				//这是前台name字段的名字,比如这里是filename
				String filename = (String) iter.next();
				
				//根据name字段来获得MultipartFile
				MultipartFile file = multiRequest.getFile(filename);
				
				//如果file不为空,就表示是一个MultipartFile文件
				//这里可不判断,因为上面已经判断了有文件类型
				if(file != null){
					String fileName = new Date().getTime()+file.getOriginalFilename();
					String path ="d:\\"+fileName;
					File localFile = new File(path);
					
					//Springmvc 提供的写文件方法
					file.transferTo(localFile);
				}
			}
			
		}
		
		return "123";
		
	}
}
上面的代码,我已写了大概注释,


其中需要注意的是这两行代码

System.out.println(request.getParameter("username"));
System.out.println(users.getUsername());

request是前台发送过来的数据,所以里面有我们的表单参数 username  这是可以理解的

而方法里面的 listuser users 以及下面的那句打印语句是怎么回事呢

首先这里的listuser是一个普通的javabean  在我的上一篇文章已提到 SpringMVC与前台JSON数据相互交互的三种实现方式 完整实例DEMO

就是SpringMVC会自动将表单中的username和password注入到listuser中

所以我们的打印语句是正确的。

而余下的代码则主要是处理文件数据。


上传文件jar包下载 commons-fileupload-1.3.1.jar  commons-io-2.2.jar



爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img