您的位置:首页 > 运维架构 > Apache

apache commons fileupload 1.3.1(五)Disk部分

2016-03-30 13:36 896 查看
近段时间,对apache commons fileupload的源码做了深入的了解,在此把一些见解与大家分享。

今天就简介一下commons fileupload的Disk部分。



Disk部分主要管理文件上传的临时文件的,其保存下来所上传文件的一些属性信息,并提供对临时文件的一些文件操作、序列化、打印、用后回收等功能。其由临时文件管理单一部分组成。

我们应该先来了解一下disk所依赖的以下commons-fileupload或commons-io类:

org.apache.commons.fileupload.FileItemFactory

该接口提供创建FileItem的方法。

org.apache.commons.fileupload.FileItem

该接口代表通过表单上传上来的文件。需使用符合RFC 1867的multipart/mixed作为encoding
type即可实例化上传文件对象。其对象是从Fileupload对象的parseRequest方法获取的。当然你也可以使用get()或request中getInputStream()来获取文件对象。该接口本身不继承javax.activation.DataSource以避免增加使用机会少的依赖。但几个已知的方法被明确地定义在接口中。它允许实现类继承DataSource接口而无需实现额外的方法。

org.apache.commons.fileupload.FileItemHeaders

该接口提供访问文件或表单元素头信息的功能。

org.apache.commons.io.FileCleaningTracker

里面有一个叫Reaper的内部类实现了后台进程。整个应用有且仅有一个Reaper进程。

而另一个叫Tracker的内部类通过继承PhantomReference(弱引用类)来维护待删除文件列表。此处使用弱引用是应该是因为设计者不希望该守护进程的引用影响主进程中业务对于这些引用的使用,特别是回收机制。使用了弱引用的话,回收机制基本会忽略这些引用,从而达到不影响主进程引用的目的。

在FileCleaningTracker中只保存文件的path而不保存文件对象。

DiskFileItemFactory使用该类进行临时文件的回收。

org.apache.commons.fileupload.util.Streams

该类是输入输出流的工具类,其提供了一些基本的流操作,比如copy()、asString();

而Streams.checkFileName()方法则是查看了文件名是否有空格,如果有则抛出InvalidFileNameException;根据我所翻译过的《apache
commons io 最佳实践》(http://blog.csdn.net/houjx114/article/details/50561148)表示文件名应该使用File类而不是String类。因此可以断定调用Streams.checkFileName()的地方肯定都是需要优化的,将String类型转为使用File类型来表示文件名。

DiskFileItem只用到了checkFileName()方法。

org.apache.commons.fileupload.ParameterParser

参数解析器,专门处理name/value这样的参数。但解析时如果遇到value中有非法字符则会停止,如果遇到MIME规范的value则调用MimeUtility进行解析。

DiskFileItem使用它进行content-type中字符集编码的提取。

org.apache.commons.fileupload.FileUploadException

当解析数据包出现错误时会抛出此异常。

org.apache.commons.io.output.DeferredFileOutputStream

该类实现了一个带阀值的文件输出流,其内部有一个ByteArrayOutputStream来缓存写入的字节串,但字节流长度未到达阀值时可暂存内存中(通过ByteArrayOutputStream实现缓存),如果达到阀值则将缓存持久化到文件中。

DickFileItem用该类来实现临时上传文件是存在内存还是硬盘。

org.apache.commons.io.IOUtils

通用输入输出流的便捷操作工具类,有许多静态的工具方法,主要有关闭流、读取流、写入流、两流间复制、两流内容是否相等。

字节转字符和字符转字节的方法,鼓励使用给定字符集编码的方法进行操作,这样对环境迁移如开发环境到运行环境能获得更好的支持。

该类中的方法都不会对流进行清洗或关闭,这样就不会影响调用处的使用。

主要使用它的copy方法。

临时文件管理部分:

org.apache.commons.fileupload.disk.DiskFileItemFactory

该类是一个上传文件条目的工厂类,其创建文件条目的同时还通过调用FileCleaningTracker来对临时文件进行监控,一旦临时文件不再使用将被删除。

org.apache.commons.fileupload.disk.DiskFileItem

该类表示一个上传文件,其内部代理一个带阀值的字节输出流,在实例化该对象时传入阀值。通过代理content-type可确认上传文件的文件类型以及字符集编码。该类还提供了获取上传文件相关信息以及上传文件临时文件的一些方法,例如getOutputStream()、getInputStream()获取临时文件的输入输出流,get()获取所上传文件的内容,getString()以字符串形式获取所上传文件的内容,delete()删除临时文件,getSize()获取上传文件的大小,write()将临时文件写入其他文件,甚至还有文件条目的序列化writeObject()以及反序列化readObject()的支持。

该类覆写了finalize()方法,一遍垃圾回收该文件条目对象时将硬盘中的临时文件删除掉。

ONE FOR IT是一个呆萌CTO打理的资讯读物,每天只为你准备一篇IT行业新鲜资讯。互联网的前沿,一篇就够了。(ID:OFI)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: