FileUpload 是 Apache commons下面的一个子项目,用来实现 环境下面的文件上传功能,与常见的SmartUpload齐名。
组件
1、FileUpLoad组件介绍
为方便用户处理文件上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。2、该组件相应的支撑jar包:
Commons-fileupload和commons-io commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。3、fileupload组件工作流程
工作原理
上传的文件要求包括一个根据RFC 1867(在HTML中基于表单的文件)编码的选项列表清单。组件FileUpload可以解析这个请求,并给你的应用程序提供一份独立上传的项目清单。无论每个项目背后如何执行都实现了FileItem接口。
每一个文件项目都有一些属性,这些可能在你的应用程序中应用到。比如:每一个项目有一个名称name和内容类型content type,并提供了一个 InputStream访问其数据。另一方面,你处理项目的方法可能有所不同,这个依赖于是否这个项目是一个规则的表单域,即:这个数据是来自普通的表单文本,还是普通的HTML域或是一个上传文件。在FileItem接口中提供了处理这些问题的方法,可以更加方便的去访问这些数据。
组件FileUpload使用FileItemFactory工厂创建新的文件项目。这个给了组件FileUpload很大的灵活性。这个工厂拥有怎样创建项目的最终控制权。工厂执行过程中上传项目文件的临时数据可以存储在内存中或硬盘上。这个依赖于上传项目的大小(即:数据的字节)。不过这种行为可以在你的应用程序中适当的自定制。
解析
在实现上传项目之前,当然需要解析这个请求。确保这个请求的确是一个正确的上传文件,组件FileUpload为了使这个判断简单,提供了一个静态的方法去做这个事情。
// 检测我们是否一个文件上传的请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
实例
最简单的使用情况如下:
* 上传项目只要足够小,就应该将其保存在内存中。
* 较大的项目应该被写入到硬盘的临时文件中。
* 应该避免有非常大的上传项目。
* 设置项目默认的在内存中所占的空间,限制最大的上传请求,并设定临时文件 的位置。
处理这种情况下的请求非常的简单:
// 创建磁盘工厂
FileItemFactory factory = new DiskFileItemFactory();
// 创建处理工具
ServletFileUpload upload = new ServletFileUpload(factory);
// 解析
List <FileItem> items = upload.parseRequest(request);
这就是我们真正需要的全部代码。
处理的结果是生成了一个文件项目列表,每个文件项目实现一个FileItem接口。下面将介绍如何处理这些项目。
控制
如果你的使用情况和上面描述的例子很接近,但是你需要在一点更多的控制限定文件的大小或临时文件的存放位置。你可以很容易的自定义上传实例或文件项目或两者的行为。下面例子展示了几种配置选项:
// 创建磁盘工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置参数
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
// 创建处理工具
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大允许的尺寸
upload.setSizeMax(yourMaxRequestSize);
// 解析
List <FileItem> items = upload.parseRequest(request);
当然,每一个配置处理方法都是独立于其他方法的,但是如果你想一次性配置这个工厂,你可以使用工厂的另一个重载方法。像这样:
DiskFileItemFactory factory = new DiskFileItemFactory( yourMaxMemorySize, yourTempDirectory);
如果你还需要更多的控制请求的解析,比如存储项目到其它地方(如:数据库),你将需要看看FileUpload自定义(注:不知道为什么这里链接过去的页面什么也没有)。
引用:
https://blog.csdn.net/qq_35448976/article/details/77185911
https://baike.baidu.com/item/fileupload/6035010?fr=aladdin