我在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上传文件的每篇文章。谁知道我做错了什么?
答案 0 :(得分:19)
java.lang.ClassNotFoundException:org.apache.commons.io.output.DeferredFileOutputStream
PrimeFaces fileupload使用Apache Commons FileUpload封面,而Apache Commons IO又有另一个依赖关系users' guide。确保您在/WEB-INF/lib
。{/ p>中同时使用了两个JAR
更新:根据评论,您还需要确保已根据{{3}} 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()
中可能正在读取{{1}}的之前没有其他过滤器,因为它只能读取一次。< / p>
答案 1 :(得分: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项目,请尝试这样做。
答案 2 :(得分: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>
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>
答案 3 :(得分:2)
我想我已经解决了你的问题。 检查你的web.xml是否存在:
<context-param>
<param-name>com.sun.faces.enableViewStateIdRendering</param-name>
<param-value>false</param-value>
</context-param>
您必须删除此选项或将其设置为True(默认值)。
答案 4 :(得分: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
答案 5 :(得分:1)
在Websphere 7中,事件被触发,因为当我选择文件并按上传时,我可以看到要上传的栏长大。 问题是在Websphere 7中,我认为有一个过滤器使用HttpRequest,当到达事件监听器时,只是消耗了所以没有数据:(
日志中没有消息,调试非常复杂。在JSF 2 Mojarra 2和PrimeFaces 3.4.2中是否存在一些跟踪或记录器?