论坛首页 Java企业应用论坛

对于moxie的"WebWork教程"补充 - [文件上传]

浏览 18817 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-02-04  
WebWork利用ognl实现的资料绑定是非常实用的功能, 能够避免繁琐调用request.getParameter, object setter, 也不需要任何的多余配置文件, 再加上转换器的功能( http://forum.iteye.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:
public class Upload implements Action {   
    private File[] uploadFiles;

    public String execute(); throws Exception {
        //store uploadFiles ...
    }
    
    public void setUploadFiles(File[] uploadFiles); {
        this.uploadFiles = uploadFiles;
    }    
}


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

页面和普通的upload页面没有区别:
<form .... enctype="multipart/form-data">
    ....
    File 1: <input type="file" name="uploadFiles">
    File 2: <input type="file" name="uploadFiles">
<form>


需要注意栏位名称和Action的属性同名就可以了, 剩下的事情就是配置拦截器:
    <interceptors>
        <interceptor name="upload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/>
            
        <interceptor-stack name="uploadStack">
            <interceptor-ref name="upload"/>                
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>           
    </interceptors>
        
    <action name="doUpload" class="yourPackage.Upload">
        <interceptor-ref name="uploadStack"/>
        <result name="success">...</result>
    </action>


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

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

结论:灵活运用拦截器可以让原本复杂,繁琐的工作变得轻松,简单.
   发表时间:2005-02-05  
我补充几点:

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来完成。
0 请登录后投票
   发表时间:2005-07-25  
因为当你上传中文文件名称的文件的时候,只有pell包会正确的获得中文文件名称,apache common会将文件名称改为xxxxxxx.tmp这样的文件名

FileUploadInterceptor拦截器直接提供了文件的名字,即使apach common修改了文件的名字,我们可以重新命名该文件,从而可以很好的使用apache common。另外apache common对多文件上传支持的很好.
0 请登录后投票
   发表时间:2005-07-26  
ww的拦截器真是伟大.
功能太强了.
0 请登录后投票
   发表时间:2006-01-19  
新的版本已经没有这个问题了,我现在就是用的jakarta的common upload包。不过好像一定要用webwork发行版里面的jar包才行,直接在apache官方下的最新版好像有问题,多文件上传的时候只能取到第一个一个文件。

是我理解错了,在action里面得到的文件名是正确的只是文件实际保存的临时文件被改成了其他名字,
0 请登录后投票
   发表时间:2006-09-14  
robbin 写道
就我的经验来看,如果你直接使用Webwork的FileUpload拦截器,我一定推荐你使用pell,因为当你上传中文文件名称的文件的时候,只有pell包会正确的获得中文文件名称,apache common会将文件名称改为xxxxxxx.tmp这样的文件名,而cos会乱码,因此我们唯一的选择只有pell。

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


我现在的做法是表单中增加了一个隐藏域,当用户文件选择后,利用JS截取到用户选择的文件名,然后一起提交上去。
不知道有没有最终的解决方法?
0 请登录后投票
   发表时间:2006-10-30  
按照上面方法,我没法实现上传多个文件。(实际上上传上去的只是最后一个文件)。调试了很长时间了,实在找不到原因,请教各位。。可能问题出在哪?我用的是2.2.4版。
0 请登录后投票
   发表时间:2006-11-15  
楼上,你把配置贴出来看看。

对于 cos和pell,其 uploadFiles[i].getName() 获取的是实际文件名,但是使用 jakarta 时,由于其自身处理方式,将上传的文件改为一个 tmp 文件名,调用 file.getName 是取到那个tmp文件名,正确的方式,是总是调用  uploadFileName[i] 来获取真实的文件名。

我现在处理也出现了问题,我的程序用的 utf-8,数据库也是, 当我上传一个文件时,非要对 uploadFileName[i]进行 gbk->utf8的转码,才可以,并且 上传的文件名称 如果是 繁体中文,或日文时,根本无法上传,非常奇怪,不知道各位有何解决方法。
0 请登录后投票
   发表时间:2006-11-16  
问题已经解决了,是webwork的问题,2.2.4 解决了这个bug。
0 请登录后投票
论坛首页 Java企业应用版

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