FileUpload使用教程 - 路大侠

时间:2024-02-23 17:30:00

FileUpload使用教程

 

最近项目中用到文件的上传下载功能,网上找了下发现JSP组件有两种:1. JSPSmartUpload ; 2 . FileUpload 。发现JSPSmartUpload网上的资料多点,但JSPSmartUpload只是免费使用的并未开放源代码,再者发现支持该组件的网站已经关闭。 所以还是选择使用开源的FileUpload组件,但发现相关资料不是很多。一时来潮,就自己动手先把FileUpload用户使用指南翻译下,英语水平 有限,借助Google翻译勉强过把翻译瘾。希望各位同僚提出修改及纠错意见。原文是下载包中commons-fileupload- 1.2.1/site/using.html文件。

 

一、 使用组件FileUpload

可 以通过许多种不同的方式使用组件FileUpload,这个主要取决于你的应用程序。在最简单的情况下,你可以调用单一的方法去解析这个 Servlet Request,然后处理选项列表,并应用到你的应用程序。另一方面,你可能决定自定义FileUpload,实现对选项列表种个别项完 全控制。例如:你可以将内容注入到数据库。

这里,我们将描述组件FileUpload的基本原则,并讲解一些简单的、常用的使用模式。FileUpload自定制将在其他地方描述。

组 件FileUpload依赖于Commons IO组件,因此在继续之前,要确保在你的工程classpath中有描述页中提到的相应版本。(这里 FileUpload版本为:commons-fileupload-1.2.1,Commons IO版本为:commons-io-1.4)

 

二、 组件FileUpload是怎样工作的

上传的文件要求包括一个根据RFC 1867(在HTML中基于表单的文件)编码的选项列表清单。组件FileUpload可以解析这个请求,并给你的应用程序提供一份独立上传的项目清单。无论每个项目背后如何执行都实现了FileItem接口。

这里将描述组件FileUpload库的普通API,这些API比较简单。不过,对于最终的实现,你可以参考最新的API流。

每 一个文件项目都有一些属性,这些可能在你的应用程序中应用到。比如:每一个项目有一个名称name和内容类型congtent type,并提供了一个 InputStream访问其数据。另一方面,你处理项目的方法可能有所不同,这个依赖于是否这个项目是一个规则的表单域,即:这个数据是来自普通的表单 文本,还是普通的HTML域或是一个上传文件。在FileItem接口中提供了处理这些问题的方法,可以更加方便的去访问这些数据。

组 件FileUpload使用FileItemFactory工厂创建新的文件项目。这个给了组件FileUpload很大的灵活性。这个工厂拥有怎样创建 项目的最终控制权。工厂执行过程中上传项目文件的临时数据可以存储在内存中或硬盘上。这个依赖于上传项目的大小(即:数据的字节)。不过这种行为可以在你 的应用程序中适当的自定制。

三、 解析request

在实现上传项目之前,当然需要解析这个请求。确保这个请求的确是一个正确的上传文件,组件FileUpload为了使这个判断简单,提供了一个静态的方法去做这个事情。

// Check that we have a file upload request 

boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

现在我们正准备解析其请求到它的组成项目中。

四、 最简单的例子

最简单的使用情况如下:

上传项目只要足够小,就应该将其保存在内存中。

较大的项目应该被写入到硬盘的临时文件中。

应该避免有非常大的上传项目。

设置项目默认的在内存中所占的空间,限制最大的上传请求,并设定临时文件  的位置。

处理这种情况下的请求非常的简单:

// Create a factory for disk-based file items 

FileItemFactory factory = new DiskFileItemFactory(); 

 

// Create a new file upload handler 

ServletFileUpload upload = new ServletFileUpload(factory); 

 

// Parse the request 

List /* FileItem */ items = upload.parseRequest(request); 

这就是我们真正需要的全部代码。

处理的结果是生成了一个文件件项目列表,每个文件项目实现一个FileItem接口。下面将介绍如何处理这些项目。

五、 实施更多的控制

如果你的使用清况和上面描述的例子很接近,但是你需要在一点更多的控制限定文件爱你大小或临时文件的存放位置。你可以很容易的自定义上传实例或文件项目或两者的行为。下面例子展示了几种配置选项:

// Create a factory for disk-based file items 

DiskFileItemFactory factory = new DiskFileItemFactory(); 

 

// Set factory constraints 

factory.setSizeThreshold(yourMaxMemorySize); 

factory.setRepository(yourTempDirectory); 

 

// Create a new file upload handler 

ServletFileUpload upload = new ServletFileUpload(factory); 

 

// Set overall request size constraint 

upload.setSizeMax(yourMaxRequestSize); 

 

// Parse the request 

List /* FileItem */ items = upload.parseRequest(request); 

 

当然,每一个配置处理方法都是独立于其他方法的,但是如果你想一次性配置这个工厂,你可以使用工厂的另一个重载方法。像这样:

 

// Create a factory for disk-based file items 

DiskFileItemFactory factory = new DiskFileItemFactory( 

        yourMaxMemorySize, yourTempDirectory); 

 

如果你还需要更多的控制请求的解析,比如存储项目到其它地方(如:数据库),你将需要看看FileUpload自定义(注:不知道为什么这里链接过去的页面什么也没有)。