论坛首页 Java企业应用论坛

关于Webwork下的文件上传进度条

浏览 13928 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-05-18  
Webwork下的文件上传看了很多的文章收获不少,目前比较简单的方式是通过webwork提供的FileUploadInterceptor来实现的,这个拦截器在使用的时候是非常方便的,通过这个拦截器可以自动获得上传文件的文件名、文件类型、文件三个部分。然后用户可以再进行后续的处理,包括将文件信息存入数据库、移动文件到制定的文件夹等。对于这个拦截器的工作原理大致是这样的,用户执行Action的时候,拦截器构造request:
java 代码
  1. HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);  

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

java 代码
  1. MultiPartRequestWrapper multiWrapper = (MultiPartRequestWrapper) request;  

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

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

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

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

java 代码
  1. ServletFileUpload upload = new ServletFileUpload(factory);   
  2. upload.parseRequest(servletRequest);  

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

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

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

这样用户可以在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. <create creator="new" javascript="UploadMonitor">  
  2.       <param name="class" value="be.telio.mediastore.ui.upload.UploadMonitor"/>  
  3. create>  
  4. <convert converter="bean" match="be.telio.mediastore.ui.upload.UploadInfo"/>  

5、将下载的包中的resource文件夹拷贝到web目录下
6、建立一个文件上传action
7、建立上传页面,添加几个js,同时在form中添加startProgress(): 

    <script src='/ugc/resources/js/upload.js'> </script>
    <script src='/ugc/dwr/interface/UploadMonitor.js'> </script>
    <script src='/ugc/dwr/engine.js'> </script>
    <script src='/ugc/dwr/util.js'> </script> 

    <ww:form action="doUpload" method="POST" enctype="multipart/form-data" onsubmit="startProgress()">这样webwork的文件上传进度条就可以实现了

  •  
  • 以上的方法有两点感觉不足,

    1、修改了webwork的jar,这样对以后的扩展不好,应该自己实现拦截器和request包装类

    2、只实现了jakarta类型的文件上传,对于cos没有实现

    欢迎大家指正和帮助!

     

  • 这里要注意的是js的路径
       发表时间:2007-05-18  
    你这里又没有Link什么的   发代码最好使用bbcode模式
    否则代码框里面会乱掉的
    0 请登录后投票
       发表时间:2007-05-18  
    blog上发过来的,没注意,修改了一下
    0 请登录后投票
       发表时间:2007-05-18  
    感谢楼主分享~
    想请教一下,楼主怎么限制上传文件的大小呢?
    0 请登录后投票
       发表时间:2007-05-18  
    jarit 写道
    感谢楼主分享~
    想请教一下,楼主怎么限制上传文件的大小呢?


    webwork.multipart.maxSize=...
    0 请登录后投票
       发表时间:2007-05-18  
    看了一下webwork上传代码,maxSize要等文件上传完才作判断,请问楼主有办法在没有传完的情况下就中止继续上传么?谢谢
    0 请登录后投票
       发表时间:2007-05-18  
    jarit 写道
    看了一下webwork上传代码,maxSize要等文件上传完才作判断,请问楼主有办法在没有传完的情况下就中止继续上传么?谢谢


    应用服务器可以设置POST的maxSize。
    2 请登录后投票
    论坛首页 Java企业应用版

    跳转论坛:
    Global site tag (gtag.js) - Google Analytics