使用带有execAndWait拦截器的struts2,文件未保存在临时路径中

时间:2014-03-13 15:05:35

标签: java struts2 interceptor

我正在开发一个struts2(2.1.8)网络应用程序。我想使用execAndWait拦截器,以便在处理上传文件时显示等待页面。

在解决了线程问题(execAndWait Interceptor not redirecting to success page after waiting)后,我没有访问getText()方法的NPE,我继续遇到一些问题。

如果调试动作执行所有jsp表单变量(包括上传的文件)都没问题(使用调试检查器我可以看到文件路径,contentType,文件名),但文件不在directori中必须是:

C:\apps\apache-tomcat-6.0.39\work\Catalina\localhost\validador\upload_24cd6d23_a0ec_4887_a47c_7af1f5b703d1_00000002.tmp

我也读过这篇文章: Cannot find file source when processing file with execAndWait interceptor of struts-jquery

但是我已经声明了一个自定义拦截器堆栈,包括default-stack:

<interceptors>          
  <interceptor name="execAndWaitExtended" class="aoc.interceptor.myExecuteAndWaitInterceptor"></interceptor>
    <interceptor-stack name="waitStack">
      <interceptor-ref name="defaultStack" />               
      <interceptor-ref name="execAndWaitExtended" />                
    </interceptor-stack>
</interceptors>

我的行动声明:

<package name="default" namespace="/" extends="struts-default" >
...
    <action name="uploadUpdatePDF" class="aoc.action.signature.UpdatePDFUpload">
        <interceptor-ref name="waitStack"/>         
        <result type="tiles" name="input">tilesDef.validacioUpdatePDF</result>          
        <result name="wait">pages/wait.jsp</result>
        <result type="tiles" name="sucess">tilesDef.validacioUpdatePDFResult</result>
    </action>

理解线程问题已解决,上传文件中的文件名或文件路径似乎没问题,我不明白为什么文件实际上没有存储在服务器目录中(并且在添加execAndWait拦截器之前它工作正常)。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我不确定你的myExecuteAndWaitInterceptor是做什么的,但它需要复制一份文件,以便它可以运行你的行动的后台线程。

在下面的代码中,我假设有一个名为AbstractUploadAction的基类,它实现了上传文件所需的方法(即获取文件和文件名)。

public class CustomExecuteAndWaitInterceptor extends org.apache.struts2.interceptor.ExecuteAndWaitInterceptor {

  @Override
  protected BackgroundProcess getNewBackgroundProcess(String name, ActionInvocation actionInvocation,
      int threadPriority) {

    BackgroundProcess bgProcess;
    if (actionInvocation.getAction() instanceof AbstractUploadAction) {
      AbstractUploadAction uploadAction = (AbstractUploadAction)actionInvocation.getAction();
      try {
        File origFile = uploadAction.getUpload();
        if (origFile != null) {
          File altFile = new File(origFile.getParentFile(), origFile.getName() + "-alt.tmp");
          FileUtils.copyFile(origFile, altFile);
          altFile.deleteOnExit();
          uploadAction.setUpload(altFile);
        }
      } catch (Exception ex) {
        throw new RuntimeException("Error copying uploaded file", ex);
      }
      bgProcess = new UploadBackgroundProcess(name + "BackgroundThread", actionInvocation, threadPriority);
    } else {
      bgProcess = super.getNewBackgroundProcess(name, actionInvocation, threadPriority);
    }
    return bgProcess;
  }


  /**
   * Wraps the standard {@link BackgroundProcess} to clean up alternate file created above.
   */
  private class UploadBackgroundProcess extends BackgroundProcess {

    public UploadBackgroundProcess(String threadName, ActionInvocation invocation, int threadPriority) {
      super(threadName, invocation, threadPriority);
    }

    @Override
    protected void afterInvocation() throws Exception {
      super.afterInvocation();
      FileUtils.deleteQuietly(((AbstractUploadAction)getAction()).getUpload());
    }
  }
}

当使用执行和等待拦截器时,您通常应该假设除非您复制它或在execAndWait拦截器启动之前注入,否则您可能无法使用任何您可能无法直接使用的资源。