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


对下面链接提供的文件上传的代码的学习。
http://maozj.iteye.com/blog/695628



      前两天看到这个文件上传的例子,大家都说不错,正好近来我在研究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,所以我们改变了属性,是可以生效的,有点我们修改引用的效果。
      



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


一款文件上传信息即时同步刷新的代码的学习_第1张图片




你可能感兴趣的:(eclipse,设计模式,工作,servlet,Blog)