【问题标题】:Primefaces FileUpload event not firing - JSF 2.0Primefaces FileUpload 事件未触发 - JSF 2.0
【发布时间】:2011-05-22 06:24:17
【问题描述】:

我在 Primefaces 论坛上发布了我的问题,但没有人回复,所以我想我会在这里尝试。

我一直在尝试让 fileUpload 工作一段时间。我目前正在使用 mojarra 2.0.3 和 Tomcat 7 运行 RC2 构建。

我有一个对话框,其中包含类似这样的 fileUpload 组件。

<p:dialog id="uploadFileDialog" >
   <h:form id="uplaodFileForm" prependId="false" enctype="multipart/form-data">
       <p:fileUpload fileUploadListener="#{fileUploadController.uploadFile} auto="true"/>    
   </h:form>
</p:dialog>

fileUploadController 看起来像这样

public class FileUploadController {
    public void uploadFile(FileUploadEvent event) {
         byte[] file = event.getFile().getContents();

         System.out.println("MADE IT INTO FILE UPLOAD !!! ");
    }
}

由于某种原因,当文件上传时,它永远不会触发 fileUploadEvent 并且永远不会进入控制器。上传看起来像它的工作,flash 部分呈现并给人的印象是它正在做某事,但没有调用任何支持 bean。我似乎可以弄清楚我做错了什么,并且我已经阅读了几乎所有关于使用 primefaces 上传文件的帖子。有谁知道我做错了什么?

【问题讨论】:

  • PF 2.1 文件上传在 Tomcat 7.0.5 上也不起作用。我在每次上传尝试的服务器日志中看到ViewExpiredException。 PF 论坛在几个主题中报告了相同的内容:“适用于 Tomcat 6,但不适用于 Tomcat 7”。您在服务器日志中看到什么了吗?
  • 对我来说,服务器日志中没有显示任何异常。它什么也没显示。但这不是好消息。有没有其他选择,所以我可以上传文件?这是我的应用程序的关键部分。
  • 实际上,现在我调查了它,我得到了一个例外,那就是 java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream 在旁注中,我要感谢你你博客上的代码。你用你的详细解决方案解决了我过去遇到的问题,真的为我节省了大量时间!非常感谢你所做的事情
  • 提示:要在他人的 cmets 上回复不属于他们自己的帖子,请使用 @nickname 自动通知他们。另见meta.stackexchange.com/questions/43019/… 至于我的ViewExpiredException 问题,它可能会在2.2 RC2 中解决。还没试过。让我知道它是否有效。
  • @BalusC, @DesireToUpload:我现在使用的是 2.2RC2。尽管自从我使用 Glassfish 以来我还没有遇到 ViewExpiredException,但在我的情况下 fileUploadEvent 从未触发

标签: jsf jsf-2 primefaces


【解决方案1】:

java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream

PrimeFaces fileupload 使用 Apache Commons FileUpload,而 Apache Commons FileUpload 又具有另一个依赖项,Apache Commons IO。确保您的 /WEB-INF/lib 中有两个 JAR。


更新:根据 cmets,您还需要确保上传过滤器在 web.xml 中声明为 users' guide

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

并且您还需要确保web.xml之前 中没有其他过滤器可能正在读取HttpServletRequest#getInputStream(),因为它只能读取一次。

【讨论】:

  • 该用户指南链接不起作用...您知道其他方法可以获取 PrimeFaces 3 用户指南显然受到严密保护的工作草案吗?
【解决方案2】:

我也遇到过类似的问题。我的解决方法(使用 Maven 项目)是在 pom.xml 文件中添加以下依赖项:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.1</version>
    </dependency>

这相当于在您的 WEB-INF/lib 中拥有相应的 .jar 文件,因此如果这不是 Maven 项目,请尝试这样做。

【讨论】:

    【解决方案3】:

    这是正确的,你必须添加

    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    

    然后是这个

    <!-- JSF mapping -->
    <servlet>
       <servlet-name>Faces Servlet</servlet-name>
       <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
       <load-on-startup>1</load-on-startup>
    </servlet>
    
    <!-- Map these files with JSF -->
    <servlet-mapping>
       <servlet-name>Faces Servlet</servlet-name>
       <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    

    另外,如果您使用 maven 添加此依赖项

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.1</version>
    </dependency>     
    <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-io</artifactId>
         <version>1.3.2</version>
    </dependency>
    <dependency>
         <groupId>portlet-api</groupId>
         <artifactId>portlet-api</artifactId>
         <version>1.0</version>
    </dependency>
    

    【讨论】:

      【解决方案4】:

      我想我已经解决了你的问题。 检查您的 web.xml 是否存在:

      <context-param>
          <param-name>com.sun.faces.enableViewStateIdRendering</param-name>
          <param-value>false</param-value>
      </context-param>
      

      您必须删除此选项或将其设置为 True(默认值)。

      【讨论】:

        【解决方案5】:

        我有同样的问题,我已经通过添加解决了它

        <filter>
            <filter-name>PrimeFaces FileUpload Filter</filter-name>
            <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>PrimeFaces FileUpload Filter</filter-name>
            <servlet-name>Faces Servlet</servlet-name>
        </filter-mapping>
        

        就像 BalusC 所说的那样。

        但是添加这个:

        <!-- JSF mapping -->
        <servlet>
           <servlet-name>Faces Servlet</servlet-name>
           <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
           <load-on-startup>1</load-on-startup>
        </servlet>
        
        <!-- Map these files with JSF -->
        <servlet-mapping>
           <servlet-name>Faces Servlet</servlet-name>
           <url-pattern>*.jsf</url-pattern>
        </servlet-mapping>
        

        因为在 J2EE 6 中这部分默认是可选的,所以当 WEB-INF/faces-config.xml 描述符存在时,JSF 2.0 Servlet 会自动激活。

        但必须正确激活 PrimeFaces 过滤器

        Jboss 6.1.0.Final / PrimeFaces 3.0.RC2

        【讨论】:

          【解决方案6】:

          在 Websphere 7 中,该事件被触发,因为当我选择文件并按上传时,我可以看到上传栏长大。 问题是在 Websphere 7 中我想有一个过滤器消耗 HttpRequest 并且当到达事件侦听器时只是消耗所以没有数据:(

          日志中没有消息,调试非常复杂。是否存在一些要在 JSF 2 Mojarra 2 和 PrimeFaces 3.4.2 中启用的跟踪或记录器?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-29
            • 2013-12-16
            • 2012-05-06
            • 2014-03-07
            • 2013-12-27
            • 1970-01-01
            • 2013-06-24
            • 2012-11-08
            相关资源
            最近更新 更多