Spring MVC+Maven 轻松实现上传文件功能

             在作上传文件功能时,首先得有一个创建完毕的Spring MVC项目。这里我以Spring MVC的HelloWord工程来示例,固然你也能够在你已有的Spring MVC工程下进行操做。css

创建Spring MVC的HelloWord工程的步骤请参考文章:手把手教你建立一个Maven+Spring MVC的HelloWorldhtml

Spring MVC的HelloWord工程的源码:http://download.csdn.net/detail/u012660464/9695653前端

下面分别记录下如何上传单个文件和上传多个文件。java


1、上传单个文件web


步骤以下:spring


一、在前端控制器配置文件(本项目所取的名字是:spring-mvc-servlet.xml)中加入上传文件所需的Bean。spring-mvc

<!--200*1024*1024即200M resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常 -->

	 <bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="209715200" />   
		<property name="defaultEncoding" value="UTF-8" />
		<property name="resolveLazily" value="true" />
	</bean>

二、在pom.xml中注入上传文件所需的依赖

<!-- 文件上传所依赖的jar包 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>


三、在项目views文件夹(项目中装页面的文件夹)下新建一个上传单个文件的页面mvc

      @uploadFile.jspapp

<%@ 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">
<title>上传单个文件示例</title>

<link rel="stylesheet" href="<%=request.getContextPath()%>/resources/css/main.css" type="text/css" />
</head>
<body>
<div align="center">

<h1>上传附件</h1>
<form method="post" action="/HelloSpringMVC/hello/doUpload" enctype="multipart/form-data">
<input type="file" name="file"/>
<button type="submit" >提交</button>
</form>
</div>
</body>
</html>


   注:
(1)form表单提交的类型必定要加上enctype="multipart/form-data",表示不对所提交的内容编码。
(2)action="" 路径中前面要加项目名,这里项目名是HelloSpringMVC。
(3)doUpload是本表单所提交的对应的处理方法。名为doUpload。
(4)input节点的name="file"中的file与doUpload方法所接收的参数名称一致。

四、定义访问成功的页面
jsp


@success.jsp

<%@ 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>
<link rel="stylesheet" href="<%=request.getContextPath()%>/resources/css/main.css" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传文件成功页面</title>
</head>
<body>
<div align="center">
<h1>Success</h1>
</div>
</body>
</html>

五、在Controller类中加入访问入口方法(就是定位到上传单个文件的页面)


//定位到上传单个文件界面 /hello/upload
		@RequestMapping(value="/upload", method=RequestMethod.GET)
		public String showUploadPage(){	
			return "uploadFile";		 //view文件夹下的上传单个文件的页面
		}

六、在Controller类中定义上传文件的响应方法(就是表单中的所提交的action中的方法名)


/**
	 * 上传单个文件操做
	 * @param RequestParam 括号中的参数名file和表单的input节点的name属性值一致
	 * @return
	 */
	@RequestMapping(value="/doUpload", method=RequestMethod.POST)
	public String doUploadFile(@RequestParam("file") MultipartFile file){

		if(!file.isEmpty()){
			try {
				
				//这里将上传获得的文件保存至 d:\\temp\\file 目录
				FileUtils.copyInputStreamToFile(file.getInputStream(), new File("d:\\temp\\file\\", 
						System.currentTimeMillis()+ file.getOriginalFilename()));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return "success";  //上传成功则跳转至此success.jsp页面
	}

七、运行验证:








2、上传多个文件


步骤以下:

一、二、4步骤同上传单个文件同样,无需重复。


三、在项目views文件夹(项目中装页面的文件夹)下新建一个上传多个文件的页面


@uploadMultifile.jsp


<%@ 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">
<title>上传多个文件示例</title>

<link rel="stylesheet" href="<%=request.getContextPath()%>/resources/css/main.css" type="text/css" />
</head>
<body>
<div align="center">
<h1>上传多个附件</h1>
<form method="post" action="/HelloSpringMVC/hello/doMultiUpload" enctype="multipart/form-data">
<input type="file" name="file1"/>
<br/>
<input type="file" name="file2"/>
<button type="submit" >提交</button>
</form>

</div>
</body>
</html>

  注:
(1)form表单提交的类型必定要加上enctype="multipart/form-data",表示不对所提交的内容编码。
(2)action="" 路径中前面要加项目名,这里项目名是HelloSpringMVC。
(3)doMultiUpload是本表单所提交的对应的处理方法。名为doMultiUpload。
(4)要传几个文件就加入几个 <input type="file" name="file2"/> 不过name的值要不一样


五、在Controller类中加入访问入口方法(就是定位到上传多个文件的页面)


//定位到上传多个文件界面 /hello/uploadMulti
		@RequestMapping(value="/uploadMulti", method=RequestMethod.GET)
		public String showUploadPage2(){	
			return "uploadMultifile";		 //view文件夹下的上传多个文件的页面
		}

六、在Controller类中定义上传文件的响应方法(就是表单中的所提交的action中的方法名)


/**
		 * 上传多个附件的操做类
		 * @param multiRequest
		 * @return
		 * @throws IOException
		 */
		@RequestMapping(value="/doMultiUpload", method=RequestMethod.POST)
		public String doUploadFile2(MultipartHttpServletRequest multiRequest) throws IOException{

			Iterator<String> filesNames = multiRequest.getFileNames(); //得到全部的文件名
			while(filesNames.hasNext()){    //迭代,对单个文件进行操做
				String fileName =filesNames.next();
				MultipartFile file =  multiRequest.getFile(fileName);
				if(!file.isEmpty()){
					log.debug("Process file: {}", file.getOriginalFilename());
					FileUtils.copyInputStreamToFile(file.getInputStream(), new File("d:\\temp\\imooc\\", 
							System.currentTimeMillis()+ file.getOriginalFilename()));
				}

			}

			return "success";
		}

注:

一、这里与上传单个文件处理方法不一样的是接收参数由MultipartFile类型变为了MultipartHttpServletRequest。

二、MultipartFile由MultipartHttpServletRequest对象的getFile(fileName)方法得到。


七、运行验证




至此,则完成了利用Spring MVC实现文件上传的功能。


源码下载