近段时间,对apache commons fileupload的源码做了深入的了解,在此把一些见解与大家分享。
今天就简介一下commons fileupload的Servlet部分。
Servlet部分是为servlet容器环境实现文件上传功能的部分,其主要由以下两部分组成:无用文件回收部分、request解析部分。
但我们应该先来了解一下servlet所依赖的以下commons-fileupload或commons-io类:
org.apache.commons.io.FileCleaningTracker
里面有一个叫Reaper的内部类实现了后台进程。整个应用有且仅有一个Reaper进程。
而另一个叫Tracker的内部类通过继承PhantomReference(弱引用类)来维护待删除文件列表。此处使用弱引用是应该是因为设计者不希望该守护进程的引用影响主进程中业务对于这些引用的使用,特别是回收机制。使用了弱引用的话,回收机制基本会忽略这些引用,从而达到不影响主进程引用的目的。
在FileCleaningTracker中只保存文件的path而不保存文件对象。
org.apache.commons.fileupload.FileUpload
该类代理了FileItemFactory,并通过继承FileUploadBase来实现各种通用解析功能。其内部只有FileItemFactory对象的getter和setter方法,以方便其子类使用。
org.apache.commons.fileupload.UploadContext
该接口解决了RequestContext中getContentLength不准确或丢失的问题。使用该接口可以实现向后兼容。但在fileupload2.x中将会被新的方法代替。
org.apache.commons.fileupload.FileItemFactory
该接口提供创建FileItem的方法。
org.apache.commons.fileupload.FileItemIterator
该接口是一个文件对象的迭代器,可迭代返回FileItemStream。
org.apache.commons.fileupload.FileUploadException
当解析数据包出现错误时会抛出此异常。
无用文件回收部分:
org.apache.commons.fileupload.servlet.FileCleanerCleanup
该类实现了ServletContextListener接口,也就是说其监听了web应用程序的初始化和销毁。在web应用被创建(一般是开启tomcat)和销毁(一般是关闭tomcat)的时候都会调用该类进行处理。
当web应用程序启动时会创建一个FileCleaningTracker对象进行上传文件的监听。而当web应用程序被销毁时则会调用FileCleaningTracker.exitWhenFinished()方法把后台线程销毁。
request解析部分:
org.apache.commons.fileupload.servlet.ServletRequestContext
该类实现了UploadContext及RequestContext的所有方法,其针对servlet所使用的HttpServletRequest进行request的处理,主要任务是对request信息进行大类的划分获取。
org.apache.commons.fileupload.servlet.ServletFileUpload
该类通过ServletRequestContext对request信息进行大类的划分提取然后调用其祖父类FileUploadBase的同名方法进行处理,以实现具体针对servlet容器的文件上传功能。
ONE FOR IT是一个呆萌CTO打理的资讯读物,每天只为你准备一篇IT行业新鲜资讯。互联网的前沿,一篇就够了。(ID:OFI)