• 关于Struts2 + swfupload的一些问题!


    最近在使用 Struts2 + swfupload 做批量上传程序的时候,遇到了不少的问题,不过最终都被解决了,在这里记录一下,分享一下,也希望能帮助各位!
     
    一. Action 中的 File 对象获取不到文件
    出现这种情况一般是由于以下几种原因导制:
    1. 没有配置文件上传的拦截器 (fileUpload) 导制的,这个拦截器是 Struts2 的内置拦截器。
       <action name="photoUpload" class="photoAction" method="upload">
        <interceptor-ref name="fileUpload" >
            <param name="allowedTypes">image/jpeg, image/jpg, image/gif</param>
            <param name="maximumSize">2048576</param>
        </interceptor-ref>
     </action>
       像这种情况,通过后台打印的日志就可以看出来,没有配置 fileUpload 拦截器的情况下,上传的时候没有任务提示。
       反之如果配置了,上传的时候后台会有如下提示信息(将log4j调到info 或者debug模式即可查看到) :
       INFO Removing file upload D:\workshop\cookray\WebRoot\temp\upload__2437f199_13b8f96a11e__7ffd_00000002.tmp ==== http-80-Processor25: com.cookray.common.aop.FileUploadInterceptor.intercept(FileUploadInterceptor.java:126)
    2. 有时候配置 fileUpload 的拦截器,发现 File 对象还是为空, 这是由于用户没有指定 params 的拦截器,这是一个封装表单数据的拦截器。
         并且要记住,需要将 params 拦截器配在 fileUpload 的后面,它们的先后顺序是有影响,具体可以试一试。如下:
       <action name="photoUpload" class="photoAction" method="upload">
            <interceptor-ref name="fileUpload" >
                <param name="allowedTypes">image/jpeg, image/jpg, image/gif</param>
                <param name="maximumSize">2048576</param>
            </interceptor-ref>
            <interceptor-ref name="params" />
     </action>
     
    3.  后台日志提示上传的文件类型不被允许,如下:
         ERROR Content-Type not allowed: upload "upload__1dac4906_13b8a76ec93__7ffd_00000006.tmp" application/octet-stream
         这样我们只需要将提示的文件类型添加到 fileUpload 拦截器的配置里面即可, 有时候用户会发现,我们上传的文件明明是个 gif 的图片,而且我们也做了配置。
        但是我们在上传的时候还是被提示? 为什么呢,原来我们在通过 swfupload 等一些客户端的插件上传的时候,插件使用了一种数据格式去上传这些文件。
        例如: application/octet-stream 、   application/x-shockwave-flash 
     
    二:不能清除struts2上传时生成的临时文件
    我们在上传文件的时候,在临时文件夹(temp) 里面会生成一些 .tmp 的临时文件,上传成功后我们会发现一些临时文件没有被删除, 往往我们就会以为这些临时文件是由上传的文件(例如图片) 产生的,其实文件生成的临时文件已经被 fileUpload 拦截器删除了, 剩下的那些临时文件是其它内容产生的。
    首先来说明一下这些临时文件都是什么内容?   其实这些临时文件包含了: 上传文件产生的临时文件(fileTmp)  和 提交的表单参数的临时文件(paramTmp),   其实 fileTemp 在上传结束的时候已经被 fileUpload 拦截器删除了,如果你看了 FileUploadInterceptor 的源代码就应该知道。 那剩下的那些 paramTmp 该怎样删除呢? 其实Struts2 已经提供了这样的一个拦截器。 我们打开 xwork-2.0.4.jar 包进入到 com.opensymphony.xwork2.interceptor 目录下可以看到,这里除了有一个ParameterInterceptor 之外,还有一个ParameterRemoverInterceptor 拦截器, 从字面上我们就应该可以看出这是一个删除参数的拦截器,配上它就可以了,如下:
     
     <interceptor name="paramsRemove" 
        class="com.opensymphony.xwork2.interceptor.ParameterRemoverInterceptor" />
     
       <action name="photoUpload" class="photoAction" method="upload">
            <interceptor-ref name="fileUpload" >
                <param name="allowedTypes">image/jpeg, image/jpg, image/gif</param>
                <param name="maximumSize">2048576</param>
            </interceptor-ref>
            <interceptor-ref name="params" />
            <interceptor-ref name="paramsRemove" />
     </action>
     
    暂到此!
     
    整理背景:港交行[2012-12-11]    晚上 11:50
     
     




  • 相关阅读:
    [每天解决一问题系列
    [每天解决一问题系列
    [每天解决一问题系列
    nodejs&mongo&angularjs
    [转]Express框架
    [转]Use HandleBars in Express
    10 Tips for Optimizing Your Website’s Speed
    One difference between AngularJS' $location and window.location
    Why does Http header contains "X-SourceFiles"?
    JavaScript数组常用方法
  • 原文地址:https://www.cnblogs.com/cookray/p/2815559.html
Copyright © 2020-2023  润新知