繁体   English   中英

Primefaces FileUpload事件未触发 - JSF 2.0

[英]Primefaces FileUpload event not firing - JSF 2.0

我在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上传文件的每篇文章。 谁知道我做错了什么?

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

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


更新 :根据评论,您还需要确保根据用户指南web.xml声明上传过滤器:

<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() ,因为它只能被读取一次。

这是正确的,你必须添加

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

aditionaly如果你使用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>

我也遇到了类似的问题。 我的修复(使用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项目,请尝试这样做。

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

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

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

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

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

Jboss 6.1.0.Final / PrimeFaces 3.0.RC2

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM