6

我无法在 PrimeFaces 3.5 上制作 fileUpload 组件来触发事件。我已经阅读了许多关于该主题的帖子,并在那里遵循了建议,但它仍然不起作用。我尝试了所有模式(简单、自动、高级)都没有成功。

如果我使用 JSF 规范中的标准 inputFile 标记,它可以正常工作。

这是我的 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>redmond</param-value>
</context-param>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>               
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

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

<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>faces/home.xhtml</welcome-file>
</welcome-file-list>  
</web-app>

这是我的视图页面的一部分,带有 fileUpload 标记:

<h:form enctype="multipart/form-data"> 
   <p:dialog id="basicDialog" header="Add pictures" widgetVar="dlg1" >  
       <p:fileUpload fileUploadListener="#{galleryManagedBean.addPicturesToGallery}" multiple="true"/>
   </p:dialog> 
</h:form>

使用从标记调用的方法从托管 bean 中提取:

@Named(value = "galleryManagedBean")
@RequestScoped
public class GalleryManagedBean {
    public void addPicturesToGallery(FileUploadEvent event)
    {
        System.out.println("Triggered upload");
    }
}

另外我想补充一点,在我使用 Chrome 中的调试器工具检查 Http POST 请求后,它会被正确触发。

我在类路径中添加了必要的库,即:

commons-fileupload-1.3.jar
commons-io-2.4.jar 
4

1 回答 1

6

这是由FacesServletJSF 2.2 的更改引起的。从那个版本开始,由于新的 Servlet 3.0 特定注释的存在,FacesServlet本机支持文件上传(特别是: HTTP 请求)。此外,还引入了一个新组件,以在标准 JSF 组件集中提供文件上传组件。multipart/form-data@MultipartConfig<h:inputFile>

这一切都与旧 PrimeFaces 3.x 版本中的 PrimeFaces 文件上传工具冲突,后者根本没有考虑到这个新的 JSF 2.2 功能。PrimeFaces 3.x 文件上传过滤器解析并消耗了整个请求,而它应该将此作业留给FacesServlet. 这导致FacesServlet无法正确解码 HTTP 请求(确定提交的值和操作)。

专为 JSF 2.2 设计的 PrimeFaces 4.0 已将这一切考虑在内。在PrimeFaces 文件上传过滤器的这个变更集中,您可以看到为识别 JSF 2.2 和绕过过滤器中的解析所做的更改。从理论上讲,完全删除文件上传过滤器注册也应该足够了web.xml,这样就不再使用了。

如果您升级到 PrimeFaces 4.0,它应该可以正常工作。巧合的是,它刚刚在 2 天前正式发布,所以你很准时。 

于 2013-10-04T13:45:11.400 回答