14

我已经在 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 上传文件的帖子。有人知道我在做什么错吗?

4

6 回答 6

19

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

PrimeFaces fileupload 在幕后使用Apache Commons FileUpload,而后者又具有另一个依赖项,即Apache Commons IO。确保您的/WEB-INF/lib.


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

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

于 2010-12-08T17:18:29.837 回答
3

我也遇到过类似的问题。我的解决方法(使用 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 项目,请尝试这样做。

于 2011-12-01T00:07:01.637 回答
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>
于 2012-07-16T00:22:03.003 回答
2

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

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

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

于 2010-12-21T23:38:38.033 回答
2

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

<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

于 2012-01-09T13:28:56.600 回答
1

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

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

于 2013-11-14T15:55:47.873 回答