`
tianhandigeng
  • 浏览: 374501 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

commons-fileupload上传组件学习记录

    博客分类:
  • java
阅读更多

      最近在用commons-fileupload做文件上传的时候遇到了一点小的麻烦,不过最终在学友的帮助下解决,在写之前先说明一下几个错误,在群里面问了上传页面中file选择框的name是否可以相同,很多人说name是不能相同的,不然就不知道是哪个上传的了,这种理解是错误的:

普通表单项name可以相同,在后台接收的时候就用String[],而且在Struts2中我们也看到,在页面中相同名字的file框
name在Action中用File[] 接收,通过这两点分析,以及之后的实验发现,name完全可以相同,下面的FileItem分析
也可以说明这一点

 先贴一下FileUpload的工具类,这是做了一个封装:

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadUtil {
	private Map fileField = new TreeMap(); 
	private Map formField = new TreeMap(); 
	private List<FileItem> list=new ArrayList<FileItem>();
	private int memoryBlock = 2048; 
	private File tempFolder = null; 
	private boolean multipart = false; 
	private HttpServletRequest request = null; 
	private final int maxSize = (int) Common.getByteSizeByBKMG(JavaCenterHome.jchConfig.get("upload_max_filesize")); 
	public FileUploadUtil(File tempFolder, int memeoryBlock) {
		this.tempFolder = tempFolder;
		this.memoryBlock = memeoryBlock;
	}
	public FileUploadUtil() {
	}
	public void parse(HttpServletRequest request, String charset) throws FileUploadException {
		this.request = request;
		multipart = FileUpload.isMultipartContent(request);
		if (multipart) {
			DiskFileItemFactory factory = new DiskFileItemFactory();
			factory.setSizeThreshold(memoryBlock);
			factory.setRepository(tempFolder);
			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setSizeMax(maxSize);
			List items;
			items = upload.parseRequest(request);
			Iterator iterator = items.iterator();
			while (iterator.hasNext()) {
				FileItem item = (FileItem) iterator.next();
				if (item.isFormField()) {
					processFormField(item, charset);
				} else {
					processUploadedFile(item);
				}
			}
		}
	}
	private void processFormField(FileItem item, String charset) {
		try {
			String name = item.getFieldName();
			String value = item.getString(charset);
			Object objv = formField.get(name);
			if (objv == null) {
				formField.put(name, value);
			} else {
				List values = null;
				if (objv instanceof List) {
					values = (List) objv;
					values.add(value);
				} else {
					String strv = (String) objv;
					values = new ArrayList();
					values.add(strv);
					values.add(value);
				}
				formField.put(name, values);
			}
		} catch (UnsupportedEncodingException e) {
			throw new IllegalArgumentException("the argument \"charset\" missing!");
		}
	}
	private void processUploadedFile(FileItem item) {
		String name = item.getFieldName();
		long size=item.getSize();
		if(size>0)
			list.add(item);
		fileField.put(name, list);
	}
	public static boolean write2file(FileItem item, File file) {
		boolean flag = false;
		try {
			item.write(file);
			flag = true;
		} catch (Exception e) {
		}
		return flag;
	}
	public List<FileItem> getFileItemList(String name) {
		if (multipart) {
			return (List<FileItem>) fileField.get(name);
		} else {
			return null;
		}
	}
	public String getParameter(String name) {
		String value = null;
		if (multipart) {
			Object obj = formField.get(name);
			if (obj != null && obj instanceof String) {
				value = (String) obj;
			}
		} else if (request != null) {
			value = request.getParameter(name);
		}
		return value;
	}
	public String[] getParameterValues(String name) {
		String[] values = null;
		if (multipart) {
			Object obj = formField.get(name);
			if (obj != null) {
				if (obj instanceof List) {
					values = (String[]) ((List) obj).toArray(new String[0]);
				} else {
					values = new String[] {(String) obj};
				}
			}
		} else if (request != null) {
			values = request.getParameterValues(name);
		}
		return values;
	}
	public File getRepository() {
		return this.tempFolder;
	}
	public int getSizeThreshold() {
		return this.memoryBlock;
	}
	public boolean isMultipart() {
		return this.multipart;
	}
	public int getMaxSize() {
		return maxSize;
	}
}

 

这个工具类有改动,之前没考虑到多文件上传,在Map只是这样存:

String name = item.getFieldName();
fileField.put(name, item);

这样有二点缺点:

1、如果name相同的话,前面上传的文件就会被后面上传的文件覆盖

2、如果上传文件的size为0,并且在最后面,那么最终fileFiled存放的是一个size为0的FilteItem这显然是无效的

 

上面最后改进后,对于多文件上传也可以起作用了。

 

下面来分析一下,这句话后,items中存的东西是怎样的:

List items;
items = upload.parseRequest(request);

 上面的意思是解析request,下面来看在我项目中一个表单提交后得到的装有FileItem的List

[name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000054.tmp, size=1bytes, isFormField=true, FieldName=productcategory_id,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000055.tmp, size=0bytes, isFormField=true, FieldName=self_type_id,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000056.tmp, size=0bytes, isFormField=true, FieldName=brand_id, 
 name=null,StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000057.tmp, size=18bytes, isFormField=true, FieldName=name, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000058.tmp, size=2bytes, isFormField=true, FieldName=productsn,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000059.tmp, size=1bytes, isFormField=true, FieldName=price,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000060.tmp, size=1bytes, isFormField=true, FieldName=marketprice, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000061.tmp, size=1bytes, isFormField=true, FieldName=weight,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000062.tmp, size=1bytes, isFormField=true, FieldName=weightunit,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000063.tmp, size=1bytes, isFormField=true, FieldName=base_sale_num, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000064.tmp, size=1bytes, isFormField=true, FieldName=product_unit,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000065.tmp, size=1bytes, isFormField=true, FieldName=store,
 name=http_imgloadCAEP58ES.jpg, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000066.tmp, size=141869bytes, isFormField=false, FieldName=productImages,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000067.tmp, size=16bytes, isFormField=true, FieldName=productImageParameterTypes, 
 name=http_imgloadCAFH1MHX.jpg, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000068.tmp, size=70138bytes, isFormField=false, FieldName=productImages, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000069.tmp, size=16bytes, isFormField=true, FieldName=productImageParameterTypes, 
 name=, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000070.tmp, size=0bytes, isFormField=false, FieldName=productImages, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000071.tmp, size=44bytes, isFormField=true, FieldName=description, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000072.tmp, size=0bytes, isFormField=true, FieldName=producttype_id,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000073.tmp, size=1bytes, isFormField=true, FieldName=valid_date,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000074.tmp, size=1bytes, isFormField=true, FieldName=ismarketable, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000075.tmp, size=1bytes, isFormField=true, FieldName=isbest, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000076.tmp, size=1bytes, isFormField=true, FieldName=isnew,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000077.tmp, size=1bytes, isFormField=true, FieldName=ishot,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000078.tmp, size=0bytes, isFormField=true, FieldName=metakeywords,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000079.tmp, size=0bytes, isFormField=true, FieldName=metadescription,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000080.tmp, size=8bytes, isFormField=true, FieldName=formhash, 
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000081.tmp, size=0bytes, isFormField=true, FieldName=id,
 name=null, StoreLocation=D:\Tomcat 6.0.20\webapps\JavaCenterHome\.\data\temp\upload_365228b4_12f048b1396__8000_00000082.tmp, size=1bytes, isFormField=true, FieldName=productsubmit]

 上面每一行就是一个FiteItem中的内容,也就是说使用commons-fileupload上传组件后,对于表单中的每一项它都会解析后构造成一个个的FileItem,我们只要操作这写FileItem就行了。

 

 

 

分享到:
评论

相关推荐

    基于commons-fileupload组件的上传下载

    【基于commons-fileupload组件的上传下载】是一种在J2EE环境下处理文件上传和下载功能的技术。这个组件是Apache Commons项目的一部分,提供了强大的文件上传能力,适用于JSP和Servlet应用程序。以下将详细介绍如何...

    commons-fileupload-1.3.3 commons-io-2.6

    在SSM中,文件上传通常涉及前端页面(由Struts处理)将文件传递给后端服务器(Spring控制),而 Commons FileUpload 和 Commons IO 就是处理这一过程的关键组件。 关于压缩包子文件的文件名称列表 "ssm_...

    两篇网文:拦截器 Common-FileUpload

    Common-FileUpload是Apache Commons项目的一部分,提供了强大的文件上传功能。下面将详细探讨这两个知识点。 首先,我们来看Struts2的拦截器。Struts2的拦截器是一种AOP(面向切面编程)的概念,它们在Action调用...

    利用org.apache.commons.fileupload上传多个文件

    在使用 Apache Commons FileUpload 进行文件上传之前,你需要确保以下组件已经准备就绪: 1. **引入依赖**:首先,你需要下载并添加 `org.apache.commons.io` 和 `log4j` 的 JAR 包到你的项目类路径中。在本例中,`...

    编码实现图片上传.rar

    总的来说,"编码实现图片上传"是一个涵盖前端交互、后端处理、文件操作和数据库交互的综合过程,而Apache Commons FileUpload组件则为这一过程提供了强大的支持。理解并熟练掌握这一流程,对于任何Web开发者来说都是...

    jsp\java上传代码

    本主题将详细讲解如何使用`Commons FileUpload`组件实现JSP中的文件上传功能,该组件是Apache Commons项目的一部分,提供了强大的文件上传处理能力。 `Commons FileUpload`是一个专门处理HTTP请求中多部分数据的库...

    Apache Commons 官方最近jar全集

    7. **commons-fileupload-1.3.1.jar**:这个库专门处理HTTP请求中的文件上传,提供了处理文件上传的组件,支持多部分/混合上传,是构建Web应用时处理用户上传文件的关键工具。 8. **commons-logging-1.2.jar**:...

    fileupload jsp上传下载组件和使用方法

    `FileUpload` JSP上传下载组件就是为此目的设计的。它允许用户通过浏览器将文件发送到服务器,同时也能提供文件的下载服务。在这个过程中,我们将探讨`FileUpload`组件的工作原理、如何集成到JSP项目中以及具体的...

    FileUpload组件使用方法

    ### FileUpload组件使用方法详解 ...通过以上步骤,我们已经完成了使用Commons FileUpload组件进行文件上传的基本配置和实现。这不仅简化了文件上传的操作流程,还提高了应用程序的安全性和稳定性。

    struts2资源包

    commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此文件 commons-io-1.3.2.jar freemarker-2.3.15.jar:Struts 2的UI标签的模板 ognl-2.7.3.jar :对象图导航语言(Object Graph Navigation ...

    upload_commons_jar合集

    通过使用`commons-fileupload`处理上传请求,`commons-io`进行文件操作,以及`commons-logging`进行日志记录,可以高效、稳定地实现文件上传功能,同时保持代码的可维护性和扩展性。 在实际开发中,我们可以创建一...

    apache commons 上传 进度条

    Apache Commons项目提供了一系列工具,其中包括一个用于处理文件上传的组件,能够帮助开发者实现文件上传进度条的功能,从而提升用户体验。 Apache Commons FileUpload是一个专门处理HTTP请求中的多部分数据...

    09_尚硅谷_文件的上传和下载_王振国 - 课堂笔记1

    文件上传和下载技术详解 文件上传和下载是许多系统和软件...文件上传和下载技术是许多系统和软件中常见的功能,commons-fileupload.jar是Apache Commons提供的一个文件上传组件,提供了许多有用的API来处理文件上传。

    commons所有的jar

    6. **commons-fileupload-1.1.1.jar**:Apache Commons FileUpload库处理HTTP多部分上传请求,使得在Web应用中接收和处理用户上传的文件变得简单。1.1.1版本包含了对大文件上传的支持和一些错误修复。 7. **commons...

    fileupload文件上传与配置

    首先,我们需要理解`Fileupload`的核心组件——`Commons FileUpload`。`Commons FileUpload`是Apache Jakarta项目的一部分,它提供了一个简单且灵活的方式来处理HTTP请求中的多部分数据,即通常用于文件上传的格式。...

    struts2上传文件需要的jar包

    在使用Struts2进行文件上传时,需要依赖两个关键的第三方库:`commons-fileupload-1.2.1.jar` 和 `commons-io-1.4.jar`。这两个库在文件上传过程中扮演着至关重要的角色。 首先,`commons-fileupload-1.2.1.jar` 是...

    介绍Jakarta Commons的烹饪书

    3. **FileUpload组件**:处理HTTP文件上传是Web开发中常见的需求,Commons-FileUpload模块提供了一个简单易用的API,能够优雅地处理大文件上传和多部分表单数据。 4. **Net组件**:Commons-Net库提供了丰富的网络...

    ssm实现文件上传jar包

    本篇文章将详细探讨如何使用SSM来实现文件上传,并关注提供的两个jar包——`commons-io-2.4.jar`和`commons-fileupload-1.2.2.jar`的作用。 1. **文件上传基本流程** 文件上传通常涉及以下几个步骤: - 前端创建...

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

    在本场景中,我们关注的是使用Maven构建的Spring MVC项目,并涉及到`commons-fileupload`和`commons-io`这两个库,它们是Java中处理文件上传的核心工具。以下是关于这个主题的详细知识点: 1. **Spring MVC**: ...

    web项目常用jar包及说明.zip

    1.commons-fileupload.jar(commons项目中的关于文件上传的包, struts2.1.6版本后必须加入此文件) 2.commons-io.jar(commons项目(commons项目就是java中一些常用的公共的组件)的io子项目,是处理异常的) 3....

Global site tag (gtag.js) - Google Analytics