一款文件上传信息即时同步刷新的代码的学习

[color=red][size=large]
对下面链接提供的文件上传的代码的学习。
[url]http://maozj.iteye.com/blog/695628[/url]
[/size][/color]

[b][color=olive][size=medium]
前两天看到这个文件上传的例子,大家都说不错,正好近来我在研究commons-fileupload,来分析一个这个代码,看看设计和实现思想。
可以肯定的是作者对fileupload是很熟悉的,这个里面的关键就是自己实现了一个FileItem,覆盖了父类里面的getOutputStream函数,所以由此就衍生了MonitoredDiskFileItem,他就是来实现这个函数的,返回一个自定义的的OutputStream,作者自定了OutputStream,感觉使用到了装饰模式,就是在MonitoredOutputStream里面封装一个OutputStreamListener,但是使用的是它的子类UploadListener,关键得一步就是在write函数里面会对UploadListener的bytesRead进行赋值,这个地方感觉要特别注意的是,MonitoredOutputStream真正做事的类是实际上还是DeferredFileOutputStream,因为在调用getOutputStream的时候,去构建的MonitoredOutputStream,第一个参数是super.getOutputStream(), 所以这个实际上还是DeferredFileOutputStream。起初我因为这里只能为DeferredFileOutputStream,但是我做了下面的修改后发现也是可以的,所以就看了一下源码,其实这个OutputStream是任何流都可以,它只做了把文件的内容拷贝到指定的输出流里面。
其他的地方就很好理解了,在servlet里面有一个分支是执行文件上传操作的,一个是实现状态查询工作的。作者在将UploadListener.FileUploadStats会在执行了文件上传操作后会将该变量放到session里面,然后以后由前端进行状态查询,这个都比较好理解。这里面有一个比较关键得是listener实际上是和MonitoredOutputStream进行绑定了,在调用了write操作后,UploadListener类的FileUploadStats里面的bytesRead变量会变化,下一次从session里面取出来的FileUploadStatus里面的bytesRead就会跟着变化,其实session本质上就是一个特殊的map,所以我们改变了属性,是可以生效的,有点我们修改引用的效果。

[/size][/color][/b]

[color=red][size=x-large]
总的来说写的很好,但是有个疑问为什么要这样实现呢,而不是以FileUpload里面自带的UploadProgressListener呢?这么实现感觉感觉和那边有点重复?
另外,我喜欢eclipse,就转成eclipse了,欢迎大家下载。
[/size][/color]

[img]http://dl.iteye.com/upload/attachment/273823/6f9c3a0a-a71a-36e4-bc58-ad478afa4dc4.gif[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值