`

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
分享到:
评论

相关推荐

    commons-fileupload实现文件上传

    本篇将详细讲解如何使用Commons FileUpload来实现文件上传的功能。 首先,理解HTTP协议中的多部分数据是至关重要的。在HTML表单提交文件时,通常会使用`enctype="multipart/form-data"`属性,此时,数据会被分割成...

    使用commons-fileupload实现的文件上传和下载

    通过以上步骤,你可以成功地使用Apache Commons FileUpload实现文件上传和下载功能,并避免中文乱码问题。在实际开发中,还可以结合Spring MVC或Struts等框架,进一步简化代码和提高代码的可维护性。

    commons-fileupload文件上传实例

    本教程将详细介绍如何利用commons-fileupload实现文件上传功能,并提供一个简单的实例。 **一、Apache Commons FileUpload简介** Apache Commons FileUpload是Apache软件基金会开发的一个开源组件,专门处理HTTP...

    一个简单的使用commons-fileupload包上传文件的例子

    本示例将详细介绍如何使用`commons-fileupload`和`commons-io`这两个库来实现一个简单的文件上传功能。 首先,我们需要引入`commons-fileupload`和`commons-io`的依赖。在Maven项目中,可以在`pom.xml`文件中添加...

    使用commons-fileupload-1.2.1实现文件上传操作

    在标题和描述中提到的"commons-fileupload-1.2.1"是该库的一个特定版本,它允许开发者在Java应用程序中实现文件上传的功能。这个版本在发布时可能是最新的,但现在可能已经有一些更新。 使用Apache Commons ...

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

    这个核心包包含了实现文件上传功能所必需的组件,主要涉及`commons-fileupload`和`commons-io`两个库。 1. **Spring MVC 框架概述** Spring MVC是Spring框架的一个模块,用于处理Web应用程序的请求和响应。它遵循...

    spring MVC +Mybatis实现的文件上传

    本教程将探讨如何使用Spring MVC和Mybatis框架来实现这一功能。Spring MVC作为Spring框架的一部分,提供了强大的MVC(模型-视图-控制器)架构支持,而Mybatis则是一个轻量级的持久层框架,两者结合可以高效地处理...

    commons fileupload

    使用Commons FileUpload,开发者可以轻松地处理多个文件上传,同时检查文件大小,限制上传类型,以及进行错误处理。这个组件支持流式处理,这意味着它不需要一次性将整个文件加载到内存中,这对于处理大文件至关重要...

    Spring MVC 文件上传下载 后端 - Java.zip

    这个压缩包文件"Spring MVC 文件上传下载 后端 - Java.zip"包含的文档可能详细阐述了如何在Java后端实现这些功能。以下是关于Spring MVC中文件上传和下载的关键知识点: 1. **Spring MVC 框架**:Spring MVC是...

    关于Spring MVC项目(maven)中通过fileupload上传文件

    总之,使用Spring MVC和Apache Commons库实现文件上传功能,涉及了Web应用架构、依赖管理、HTTP请求处理、文件操作等多个方面的知识点。理解并熟练运用这些概念和技巧,对于开发高效、安全的文件上传功能至关重要。

    spring mvc上传文件

    在本文中,我们将深入探讨如何使用Spring MVC框架与Ajax技术结合来实现文件上传的功能。Spring MVC是Spring框架的一部分,提供了一种模型-视图-控制器(MVC)架构模式,用于构建Web应用程序。Ajax(Asynchronous ...

    SpringMVC文件上传multpathfileJar包commons-fileupload-1.3.3

    `SpringMVC文件上传multpathfileJar包commons-fileupload-1.3.3`和`commons-io-2.4.jar`是实现这一功能的关键依赖库。这两个库提供了处理HTTP请求中的多部分数据(包括文件上传)的功能。 1. **Spring MVC中的文件...

    用commons-fileupload实现的上传实例

    本文将深入探讨如何使用`commons-fileupload-1.2.jar`这个组件来实现文件上传的实例。 Apache Commons FileUpload是Apache软件基金会开发的一个开源项目,它的主要目标是提供一个简单且可扩展的API,用于处理HTTP...

    spring mvc 文件上传 代码完整版

    在Spring MVC中实现文件上传,首先需要在`web.xml`配置文件中添加MultipartResolver,通常是`CommonsMultipartResolver`,这是Spring MVC处理文件上传的关键组件。它依赖于Apache Commons FileUpload库,需要将其...

    spring mvc 上传文件显示进度

    在Spring MVC中实现文件上传并显示进度是一项常见的需求,特别是在用户需要等待较长时间的大型文件上传时。这个功能可以通过监听文件上传的进度并在前端实时更新来提升用户体验。下面将详细介绍如何利用Spring MVC...

    commons-fileupload及源码

    7. **与其他库的集成**:Apache Commons FileUpload可与Servlet API、Spring MVC、Struts等Web框架无缝集成,简化了在这些框架中实现文件上传的复杂性。 源码分析对于理解其内部工作原理非常有帮助。`commons-...

    commons-fileupload-1.3.1.jar

    在实际应用中,结合Servlet或Spring MVC等框架,可以轻松地集成Apache Commons FileUpload,处理用户的文件上传请求,从而构建安全、可靠的文件上传功能。同时,这个库也支持自定义策略,如文件存储路径、临时文件...

    Spring MVC实现文件的上传和下载

    至于“lib”文件,这通常指的是项目依赖的库文件,可能包含了Spring MVC框架本身以及处理文件上传下载所需的相关库,如Apache Commons FileUpload和Apache Commons IO。在Java项目中,这些库通常被打包成JAR文件放入...

    commons-fileupload上传组件

    7. **与其他组件集成**:FileUpload常与Spring MVC、Struts等框架集成,处理文件上传请求。通过了解其工作原理,开发者可以更好地调试和优化与这些框架的交互。 总的来说,Apache Commons FileUpload是处理HTTP文件...

    commons-fileupload-1.3.2.jar

    - Spring MVC: 在Spring MVC应用中,可以与`CommonsMultipartResolver`结合,自动处理文件上传。 - Struts 2: 对于基于Struts 2的应用,可以通过配置`struts.multipart.parser`属性为`jakarta`来启用Apache ...

Global site tag (gtag.js) - Google Analytics