WebWork文件上传实现浅析
创始人
2024-04-15 04:30:16
0

Webwork文件上传看了很多的文章收获不少,目前比较简单的方式是通过webwork提供的FileUploadInterceptor来实现Webwork文件上传,这个拦截器在使用的时候是非常方便的,通过这个拦截器可以自动获得上传文件的文件名、文件类型、文件三个部分。然后用户可以再进行后续的处理,包括将文件信息存入数据库、移动文件到制定的文件夹等。

对于这个拦截器的工作原理大致是这样的,用户执行Action的时候,拦截器构造request:

java 代码

  1. HttpServletRequest request = (HttpServletRequest)   
  2. ac.get(ServletActionContext.HTTP_REQUEST);    

然后判断request是否是MultiPartRequestWrapper的一个实例,接下来初始化MultiPartRequestWrapper:

java 代码

  1. MultiPartRequestWrapper multiWrapper =   
  2. (MultiPartRequestWrapper) request; 

这里就通过判断用户在webwork.properties中定义Webwork文件上传类型来构造MultiPartRequestWrapper,

java 代码

  1. String parser = Configuration.getString  
  2. (WebWorkConstants.WEBWORK_MULTIPART_PARSER);      
  3. // If it's not set, use Jakarta      
  4. if (parser.equals("")) {      
  5. log.warn("Property webwork.multipart.parser not set." +      
  6. " Using com.opensymphony.webwork.dispatcher.  
  7. multipart.JakartaMultiPartRequest");      
  8. parser = "com.opensymphony.webwork.dispatcher.  
  9. multipart.JakartaMultiPartRequest";      
  10. }      
  11. // legacy support for old style property values      
  12. else if (parser.equals("pell")) {      
  13. parser = "com.opensymphony.webwork.dispatcher.  
  14. multipart.PellMultiPartRequest";      
  15. } else if (parser.equals("cos")) {      
  16. parser = "com.opensymphony.webwork.dispatcher.  
  17. multipart.CosMultiPartRequest";      
  18. } else if (parser.equals("jakarta")) {      
  19. parser = "com.opensymphony.webwork.dispatcher.  
  20. multipart.JakartaMultiPartRequest";      
  21. }     

假设用户定义了jakarta,这时候就通过JakartaMultiPartRequestMonitor来实现Webwork文件上传(通过common-fileupload),同时获得文件的名称和类型等信息。

对于文件上传进度条,网上提供了一种给予servlet的解决办法,这种方式可以很方便的使用在Struts模式下的mvc架构的程序中,其中用到的类包可以在http://www.telio.be/blog/wp-content/uploads/2006/01/上找到,这种方式的实质是用到了dwr的回调方式。servlet的上传方式是通过下面的方式实现的:

java 代码

  1. ServletFileUpload upload =   
  2. new ServletFileUpload(factory);      
  3. upload.parseRequest(servletRequest);      

而进度条是通过实现一个factory,来实现上传状态的回调。

webwork的拦截器实际已经将上传文件到临时目录封装在内部的类中,这样我们就无法构造factory来实现进度条的监控,给予以上的考虑,想了一个比较笨的办法,将MultiPartRequestWrapper修改一下,增加一个新的属性定义:

java 代码

  1. else if (parser.equals("monitor"))   
  2. {      
  3. parser = "com.opensymphony.webwork.  
  4. dispatcher.multipart.JakartaMultiPartRequestMonitor";     
  5. }   

这样用户可以在webwork.properties中设置上传的模式为monitor,然后自己实现一个JakartaMultiPartRequestMonitor,在这个class中,将原有的factory实现方法通过带进度条的方式来实现,这样就能监控到servlet上传的进度。基本的实现思路就是这样的。下面将几个配置过程整理一下:

1、将修改的两个类添加到webwork2.2.x。jar中:MultiPartRequestWrapper。class和JakartaMultiPartRequestMonitor.class

2、修改webwork.webwork.properties:webwork.multipart.parser=monitor

3、将刚才下载的be.telio.mediastore.ui.upload的代码加入

4、修改dwr.xml文件,添加下面的代码:

xml 代码

  1.      
  2. name="class" value="  
  3. be.telio.mediastore.ui.upload.UploadMonitor"/>     
  4. create>     
  5. be.telio.mediastore.ui.upload.UploadInfo"/>   

5、将下载的包中的resource文件夹拷贝到web目录下

6、建立一个文件上传action

7、建立Webwork文件上传页面,添加几个js,同时在form中添加startProgress():

  1.    
  2.    
  3.  
  4.    
  5.  
  6.    
  7.    
  8. multipart/form-data" onsubmit="startProgress()">  

这样WebWork文件上传进度条就可以实现了

【编辑推荐】

  1. WebWork注入Servlet方法详解
  2. WebWork中返回INPUT的原因
  3. WebWork如何实现文件上传配置过程
  4. 通过WebWork实现HelloWorld
  5. WebWork与Spring+Hibernate的整合

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...