当前位置: 首页 > 知识库问答 >
问题:

未使用struts2和execAndWait拦截器将文件保存在临时路径中

汪驰
2023-03-14

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

在解决了线程问题(execAndWait拦截器在等待后没有重定向到success页面)之后,我没有一个NPE访问getText()方法,我继续遇到一些问题。

如果调试动作执行所有的jsp表单变量(包括上传的文件)都可以(与调试检查员我可以看到文件路径,内容类型,文件名),但文件不在目录中它必须是:

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

我也读过这篇文章:无法找到文件源时,处理文件的struts-jQuery的执行等待拦截器

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

<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>

理解线程问题解决了,从上传的文件的文件名或文件路径似乎可以调试,我不明白为什么文件实际上没有存储在服务器目录中(和它的工作正常之前执行和等待拦截器被添加)。

有什么建议吗?

共有1个答案

危文乐
2023-03-14

我不确定你的myExekteAndWaitInterceptor是做什么的,但是它需要复制文件,以便运行你的操作的后台线程可以使用。

在下面的代码中,我假设有一个名为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());
    }
  }
}

当使用执行和等待拦截器时,您通常应该假设,您可能想要的任何资源,如果不是直接对您的操作可用,则不会对您可用,除非您在执行和等待拦截器启动之前复制它或注入它。

 类似资料:
  • 主要内容:1. 动作,2. JSP页面,3. 执行和等待拦截器,4. 示例,参考在Struts2中附带一个名为“execAndWait”一个非常有趣的“执行和等待”拦截器,这是一个非常方便的拦截器长时间运行操作在后台,显示用户的自定义的等待页面。在本教程中,它显示了一个完整的使用 Struts2 execAndWait 拦截器的例子。 1. 动作 一个普通的动作类,有一个长时间运行进程,证明了execAndWait效果。 LongProcessAction.java 2. J

  • 主要内容:Struts2框架的拦截器:,如何使用拦截器?,创建自定义的拦截器,创建拦截器类:,创建动作类:,创建视图,创建页面:,配置文件,堆叠多个拦截器:拦截器的概念是Servlet过滤器或JDK代理类一样的。拦截器允许横切功能分开实现的动作,以及框架。使用拦截器,可以实现如下: 提供预处理行动之前被称为逻辑。 提供后处理逻辑动作后被调用 捕获异常,这样可以进行替代处理。 Struts2框架提供的许多功能都使用拦截实现的例子包括异常处理,文件上传,生命周期回调和验证等事实上作为Struts2的

  • 我尝试使用Struts2上传文件(图像)。但是,我的文件、文件内容和文件名类型的值为空!我试图寻找这个问题,但没有任何结果。 这就是我想做的: jsp: 行动: struts.xml

  • 例子 $ gcc -save-temps a/foo.c $ ls foo.* foo.c foo.i foo.o foo.s $ gcc -save-temps=obj a/foo.c -o a/foo $ ls a foo foo.c foo.i foo.o foo.s 技巧 如上所示,使用选项-save-temps可以保存gcc运行过程中生成的临时文件。这些中间文件的名字是

  • 问题内容: 如何保存/加载类所在的文件?我之前没有该位置的物理路径,而是想动态地找到该文件。 我想加载一个XML文件并对其进行读写,但我不确定该如何解决。 问题答案: 在一般情况下,您不能。从类加载器加载的资源可以是任何东西:目录中的文件,嵌入jar文件中的文件,甚至可以通过网络下载。

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器