`

Spring MVC使用commons fileupload实现文件上传功能

阅读更多

 

通过Maven建立Spring MVC项目,引入了Spring相关jar依赖。

 

1、为了使用commons fileupload组件,需要在pom.xml中添加依赖;

 

<properties>
		<spring.version>3.0.7.RELEASE </spring.version>
		<junit.version>3.8.1</junit.version>
		<fileupload.version>1.2.2</fileupload.version>
	</properties>
	<dependency>
		<groupId>commons-fileupload</groupId>
		<artifactId>commons-fileupload</artifactId>
		<version>${fileupload.version}</version>
	</dependency>

 

2、配置Spring MVC,项目成功启动后,编写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>Errors导入Excel</title>
	</head>
	<body>
		<div>
			<!--只有将表单的enctype设置为multipart/form-data,才能实现文件上传;表单enctype的默认值为:application/x-www-form-urlencoded-->
			<!--只有POST方法才会被解析为文件上传请求    -->
			<form action="./fileupload" method="post" enctype="multipart/form-data">
				<!-- 不知道为啥,type="file"这一标签必须同时添加name属性,否则在处理上传时,无法检测到上传文件 -->
				<input type="file" name="fileField"/>
				<input type="submit" value="上传"/>				 
			</form>
			<p><font color="red">上传文件大小限制在1M之内</font></p>
		</div>
	</body>
</html>

 

注:注释当中的内容还是很重要的,使用时遇到了比较多奇葩的问题,暂时还未弄明白原因,留待日后解决。

注:实现上传文件的表单,需要指定method="post"且enctype="multipart/form-data",否则无法通过fileupload组件解析为上传请求。

 

3、编写Controller,名为FileUploadController,在Controller中对上传文件进行处理;

 

@Controller
public class FileUploadController {
	
	@RequestMapping("/fileupload")
	public String handleFileUpload(HttpServletRequest request){
		boolean flag = false;
		
		//判断是否是文件上传请求
		if(ServletFileUpload.isMultipartContent(request)){
			// 创建文件上传处理器
			ServletFileUpload upload = new ServletFileUpload();
			//限制单个上传文件的大小
			upload.setFileSizeMax(1L<<24);
			
			try {
				// 解析请求
				FileItemIterator iter = upload.getItemIterator(request);
				
				while (iter.hasNext()) {
				    FileItemStream item = iter.next();
				    
				    if (!item.isFormField()) {
				    	//是文件上传对象,获取上传文件的输入流
				    	InputStream srcinInputStream = item.openStream();
				    	/*对上传文件的输入流进行处理,跟本地的文件流处理方式相同*/
				        
				    }
				}
			} catch (FileUploadException e) {
				System.out.println("上传文件过大");
			} catch (IOException e) {
				System.out.println("文件读取出现问题");
			}
		}
		
		return flag? "success":"error";
	}
}

 

注:commons fileupload的用户指南 http://commons.apache.org/proper/commons-fileupload/using.html;

注:判断上传请求及处理使用了Streaming API http://commons.apache.org/proper/commons-fileupload/streaming.html;

内容如下:

注:第一次看commons fileupload组件的用户指南时,感觉无从下手,其实User Guide的Parsing the request部分已经给出了很明确的说明。可以通过在对应的请求处理方法中直接通过ServletFileUpload.isMultipartContent(request)来判断是否是文件上传请求,通过 !item.isFormField() 来判断是否是文件上传对象;

 

 4、fileupload组件上传文件时,获取普通域参数值和文件域输入流;

       html元素的form表单的enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。表单的enctype默认值为 "application/x-www-form-urlencoded",在表单发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值);对于文件上传,form表单的enctype="multipart/form-data",此时form表单不对字符编码,此时在请求的处理函数中无法通过request.getParameter("parameterName")来获取参数值;

 

但是可以通过其他方式来获取参数值;

/**
	 * 获取页面传递的参数,以Map存储,以fieldName为键值,普通域存储value,文件上传域存储文件输入流
	 * @param request
	 * @return
	 */
	private Map<String, Object> getParameters(HttpServletRequest request){
		Map<String, Object> parameters = new HashMap<String, Object>();
		
		// 默认最多允许存储1024个字节
		DiskFileItemFactory factory = new DiskFileItemFactory();
		
		if(ServletFileUpload.isMultipartContent(request)){
			ServletFileUpload upload = new ServletFileUpload(factory);
			
			try{
				List<FileItem> items =upload.parseRequest(request);
			
				for(Iterator<FileItem> iter = items.iterator(); iter.hasNext();){
					FileItem item = iter.next();
					
					if(item.isFormField()){
						//普通域,取参数值
						parameters.put(item.getFieldName(), item.getString());
					}else{
						//文件上传域,取输入流
						parameters.put(item.getFieldName(), item.getInputStream());
					}
				}
			}catch(Exception exception){
				exception.printStackTrace();
			}
		}
		
		return parameters;
	}

 

 

 

  • 大小: 34.6 KB
分享到:
评论

相关推荐

    spring mvc核心包(包含文件上传)

    spring mvc核心包,包含spring mvc文件上传所需的commons.fileupload和commons.io

    Spring MVC文件上传与下载

    Spring MVC 框架的文件上传是基于 commons-fileupload 组件的文件上传,只不过 Spring MVC 框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。 commons-...

    利用 FormData 对象和 Spring MVC 配合实现Ajax文件下载功能

    利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能: 步骤 1.导入组件并准备静态脚本 &lt;groupId&gt;commons-fileupload &lt;artifactId&gt;commons-fileupload &lt;version&gt;1.3.2 &lt;h1&gt;Ajax 文件上载 &lt;...

    com.springsource.org.apache.commons.fileupload-1.2.0.jar

    spring mvc 上传需要的jar包 com.springsource.org.apache.commons.fileupload-1.2.0.jar com.springsource.org.apache.commons.io-1.4.0.jar

    Spring_MVC_051:Spring MVC 学习总结(五)——校验与文件上传

    Spring MVC 学习总结(五)——校验与文件上传 目录 2.2.7、范围 2.2.8、其它注解 2.3、注解控制器参数 1.4、在UI中添加错误标签 ...4.1、Servlet3.0以下的通过commons-fileupload上传 4.1.1、添加上传依赖包 4.1.2

    spring mvc开发集合包

    初用spring mvc 找各种包用了不少时间,而且下载也比较慢,特将有可能用到的大部分包集合起来,大家可以根据需要选择。 包括:spring mvc 官方发布的所有包,版本3.1.0 另外还包括: aopalliance-1.0.jar aop支持包...

    spring3.0_mvc框架_06_上传的实现.flv

    基于spring 3.0mvc 框架的文件上传实现 1. spring使用了apache-commons下得上传组件,因此,我们需要引入两个jar包: 1. apache-commons-fileupload.jar 2. apache-commons-io.jar 2. 在springmvc-servlet.xml配置...

    commons-fileupload&&commons-io.rar

    springmvc文件上传所需jar包,在Spring MVC中实现文件上传十分方便,它为文件上传提供了直接的支持

    springmvc文件上传所需jar包

    com.springsource.org.apache.commons.fileupload-1.2.0.jar com.springsource.org.apache.commons.io-1.4.0.jar

    spring4.3.9相关jar包

    spring-web.jar(必须) :这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。...

    springmvc+spring+mybatis整合所需jar

    aopalliance-1.0.jar aspectjweaver-1.7.1.jar commons-fileupload-1.2.2.jar commons-logging-1.1.1.jar druid-0.2.9.jar jstl-1.2.jar junit-4.11.jar mybatis-3.1.1.jar mybatis-spring-1.1.1.jar mysql-...

    SSH基于Eclipse实现Web层的分页功能源代码

    教学-传智播客-项目视频经典之作巴巴运动网106集-27实现Web层的分页功能源代码 所需要的jar文件: (一)、Hibernate: 位于 "\hibernate-distribution-3.3.2.GA" 目录下的jar文件: hibernate3.jar 位于 "\...

    spring springmvc mybatis 整合jar包

    spring springmvc mybatis的整合jar包,以及mysql,Junit,fastJson等的jar包,导入这些jar包 搭一个SSM的环境,可以使用SSM框架做一个简单的能够实现增删改查的小项目,具体的jar包及其版本如下 : aopalliance-1.0....

    struts spring lib

    commons-fileupload.jar commons-lang.jar commons-logging.jar commons-pool-1.2.jar commons-validator.jar jakarta-oro.jar jdom.jar jstl.jar junit.jar log4j-1.2.8.jar naming-factory.jar poi-3.0-alpha2-...

    spring+struts+hibernate+dwr+jstl做的实例

    struts.jar spring-web.jar spring-webmvc.jar spring-portlet.jar struts.jar commons-fileupload.jar commons-httpclient.jar freemarker.jar jasperreports-1.3.3.jar commons-io.jar...

    实现Web层的分页功能源代码

    教学-传智播客-项目视频经典之作巴巴运动网106集-27实现Web层的分页功能源代码 所需要的jar文件: (一)、Hibernate: 位于 "\hibernate-distribution-3.3.2.GA" 目录下的jar文件: hibernate3.jar 位于 "\...

    springMVC用到的jar包

    aopalliance-1.0.jar commons-fileupload-1.2.2.jar commons-io-2.4.jar commons-logging-1.1.1.jar jackson-core-asl-1.9.13.jar jackson-mapper-asl-1.9.13.jar shiro-core-1.2.3.jar shiro-ehcache-1.2.3.jar ...

    c3p0-0.9.1.2等等

    commons-fileupload commons-httpclient commons-io commons-lang commons-logging commons-logging-1.0.4 commons-pool dom4j-1.6.1 dwr ehcache-1.1 hibernate3 itext-1.3 jaas jakarta-oro-2.0.8 jaxen-1.1-beta-...

    springmvc-用到的jar包

    spring-aop-4.1.8.RELEASE.jar,spring-aspects-4.3.16.RELEASE.jar,spring-...framework-4.1.3.jar,commons-collections-3.1.jar,commons-fileupload-1.3.2.jar,commons-io-1.3.2.jar,commons-logging-1.1.jar

    Spring、MyBatis和SpringMVC整合的jar包

    spring mvc5.0.4、commons-fileupload-1.3.3.jar、Apache log4j 2、mybatis、mybatis-spring-1.3.2、mysql-connector-java.jar、jstl-1.2.jar、aspectjweaver-1.8.10.jar jackson相关包 jackson-annotations-2.8.0....

Global site tag (gtag.js) - Google Analytics