Webwork文件上传

原创 2007年10月09日 09:55:00

WebWork利用ognl实现的资料绑定是非常实用的功能, 能够避免繁琐调用request.getParameter, object setter, 也不需要任何的多余配置文件, 再加上转换器的功能( http://forum.javaeye.com/viewtopic.php?t=10507 ), 我们就可以用一个业务对象, 从前台一直串到后台, 再也不需要考虑String转化, 不需要DTO, 不需要FormBean了.

如果能够把web应用上常见的上传文件也用数据绑定来实现, 那么就是非常完美了: action再也不需要了解任何web信息, 需要对具体的Object进行操作, 就调用getObject, 需要对用户上传的文件进行操作, 就调用getFile.

在webwork2.1.5以前, wiki上有一篇文档: http://wiki.opensymphony.com/display/WW/File+Upload+Interceptor, 介绍了如何实现这种做法, 在2.1.5以后, 这个拦截器被加入了正式release版本里面: com.opensymphony.webwork.interceptor.FileUploadInterceptor

先来看一下我们的Action:

代码
  1. public class Upload implements Action {      
  2.     private File[] uploadFiles;   
  3.   
  4.     public String execute() throws Exception {   
  5.         //store uploadFiles ...   
  6.     }   
  7.        
  8.     public void setUploadFiles(File[] uploadFiles) {   
  9.         this.uploadFiles = uploadFiles;   
  10.     }       
  11. }   

 

我们可以看到这个Action相当的简单, 只要定义一个File类型的属性以及setter, 我们就可以用这个File对象来作任何事情了.

页面和普通的upload页面没有区别:

代码
  1. <form .... enctype="multipart/form-data">   
  2.     ....   
  3.     File 1: <input type="file" name="uploadFiles">   
  4.     File 2: <input type="file" name="uploadFiles">   
  5. <form>   

 

需要注意栏位名称和Action的属性同名就可以了, 剩下的事情就是配置拦截器:

xml 代码
  1. <interceptors>  
  2.     <interceptor name="upload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/>  
  3.            
  4.     <interceptor-stack name="uploadStack">  
  5.         <interceptor-ref name="upload"/>                   
  6.         <interceptor-ref name="defaultStack"/>  
  7.     </interceptor-stack>              
  8. </interceptors>  
  9.        
  10. <action name="doUpload" class="yourPackage.Upload">  
  11.     <interceptor-ref name="uploadStack"/>  
  12.     <result name="success">...</result>  
  13. </action>  

 

除此之外, 这个拦截器还提供了额外的信息: ContentType和FileName供我们使用:
[File Name]ContentType: 文件的ContentType(可以用在做download的时候)
[File Name]FileName: 实际的文件名
在上面的action例子里, 那么有uploadFilesContentType和uploadFilesFileName这2个属性, 也能够被自动绑定.

具体的代码可以参考webwork的upload example

结论:灵活运用拦截器可以让原本复杂,繁琐的工作变得轻松,简单.

另补充几点:

webwork的文件上传实际上是封装了几种通用的File Upload lib,并不是自己实现的,这它包括了pell,cos,apache common三种实现。

cos是oreilly的包,访问地址在http://servlets.com

cos包的功能是最全面的,也是我最喜欢用的文件上传lib

apache common 是apache的common中的一个

pell的来源我没有考证过。

webwork对这三个包的封装有些类似apache common logging,提供了一个通用的访问接口,至于具体用什么,则在webwork.properties中配置。

就我的经验来看,如果你直接使用Webwork的FileUpload拦截器,我一定推荐你使用pell,因为当你上传中文文件名称的文件的时候,只有pell包会正确的获得中文文件名称,apache common会将文件名称改为xxxxxxx.tmp这样的文件名,而cos会乱码,因此我们唯一的选择只有pell。

我不了解pell和apache common,但是webwork的封装丧失了很多cos的功能。cos需要设置request的character encoding,但是webwork的封装没有设置,所以就导致了cos的乱码问题,当然如果你单独使用cos,则会避免此类问题。

在webwork的file upload 拦截器功能中,它提供的File只是一个临时文件,Action执行之后就会被自动删除,因此你必须在Action中自己出来文件的存储问题,或者写到服务器的某个目录,或者保存到数据库中。如果你准备写到服务器的某个目录下面的话,你必须自己面临着处理文件同名的问题,但是实际上cos包已经提供了文件重名的自动重命名规则。

因此我的建议是不复杂的应用直接使用webwork的拦截器,复杂的应用自己写拦截器调用cos来完成。

 

webwork action同时输出图片以及其他数据信息到jsp

在项目中 我们经常会碰到要输出图片以及查询结果list到页面jsp的情况,单纯的只输出list到jsp倒是很简单。但是要将2者同时输出 ,可能就有点麻烦。  不知道webwork是否提供了这方面的支...
  • zkn_CS_DN_2013
  • zkn_CS_DN_2013
  • 2013年11月28日 15:52
  • 1200

关于webwork框架返回JSON数据格式的问题2015-10-27

最近接触到webwork框架,因为项目需求,需要将后台的数据采用json格式返回。 通过百度搜索,找到的方法也很多,但都讲得不够具体,不容易看懂。这里找到一个方法,写了一个返回json的类继...
  • neil89
  • neil89
  • 2015年10月27日 16:08
  • 1335

细谈Struts2框架(一) Struts2框架之原理

Struts 最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages、Servlet、标签库以及面向对象的技术水准。最初的...
  • huo_yun
  • huo_yun
  • 2015年09月30日 23:21
  • 2156

WebWork 文件上传

  • 2008年09月24日 09:57
  • 5.43MB
  • 下载

fileupload+dwr2+webwork2实现带进度条上传文件

  • 2010年11月02日 10:52
  • 14KB
  • 下载

webwork中上传文件

  • 2008年12月13日 18:34
  • 28KB
  • 下载

SSH(文件上传+远程连接)+putty连接工具.zip

  • 2018年01月09日 17:15
  • 5.36MB
  • 下载

SpringMVC 头像文件上传

  • 2018年01月08日 09:47
  • 118KB
  • 下载

spring 文件上传实例

  • 2017年10月16日 10:13
  • 17.52MB
  • 下载

UploadiFive jquery html5文件上传插件使用[带项目源码]

  • 2016年03月09日 00:00
  • 654KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Webwork文件上传
举报原因:
原因补充:

(最多只允许输入30个字)