fileupload(Apache commons的子项目)

FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名。

工作原理

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

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

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

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

解析

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

//检测我们是否一个文件上传的请求

boolean isMultipart=ServletFileUpload.isMultipartContent(request);

实例

最简单的使用情况如下:

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

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

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

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

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

//创建磁盘工厂

FileItemFactory factory=new DiskFileItem(Factory);

//创建处理工具

ServletFileUpload upload=new ServletFileUpload(factory);

//解析

List items=upload.parseRequest(request);

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

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

控制

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

//创建磁盘工厂

DiskFileItemFactory factory=new DiskFileItemFactory();

//设置参数

factory.setSizeThreshold(yourMaxMemorySize);

factory.setRepository(yourTempDirectory);

//创建处理工具

ServletFileUpload upload=new ServletFileUpload(factory);

//设置最大允许的尺寸

upload.setSizeMax(yourMaxRequestSize);

//解析

List items=upload.parseRequest(request);

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

DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize,yourTempDirectory);

如果你还需要更多的控制请求的解析,比如存储项目到其它地方(如:数据库),你将需要看看FileUpload自定义。

该文章由作者:【韶华白首】发布,本站仅提供存储、如有版权、错误、违法等相关信息请联系,本站会在1个工作日内进行整改,谢谢!

发表回复

登录后才能评论