p:fileUpload没有在辅助bean中设置上传文件

时间:2011-12-21 10:54:57

标签: jsf file-upload jsf-2 primefaces

我遇到了<p:fileUpload> PrimeFaces的问题。我创建了一个Facelet页面来上传文件,如下所示:

<h:form id="welcomeForm">
    <p:fileUpload value="#{fileUploadController.uploadedFile}" mode="simple" />
    <h:commandButton value="Submit" action="#{fileUploadController.submit}" />
    <h:message for="welcomeForm" />
</h:form> 

以及如下的支持bean:

public class FileUploadController {   

    private UploadedFile uploadedFile;

    public FileUploadController() {
    }       

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
    }

    public void submit() {    
        // Get information you from the uploaded file
        System.out.println("Uploaded file name : " + uploadedFile);
    }

} 

当我点击Submit按钮时,会调用submit()方法,但结果如下:

  

信息:上传的文件名:null

这是如何引起的?如何解决?

5 个答案:

答案 0 :(得分:12)

请阅读PrimeFaces User Guide<p:fileUpload>章节。

  

FileUpload入门

     

首先要做的是配置解析multipart请求的fileupload过滤器。 FileUpload过滤器应该映射到Faces Servlet。

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

简单文件上传

     

简单文件上传模式在传统模式下工作,文件输入的值应为a   UploadedFile实例。

<h:form enctype="multipart/form-data">
    <p:fileUpload value="#{fileBean.file}" mode="simple" />
    <p:commandButton value="Submit" ajax="false"/>
</h:form>
     
import org.primefaces.model.UploadedFile;

public class FileBean {
    private UploadedFile file;
    //getter-setter
}

请注意表单的enctype="multipart/form-data"属性。这对于HTML是必需的,以便能够将文件发送到服务器。对于JSF,过滤器是必需的,以便从multipart/form-data请求中提取数据。如果没有其中任何一个,则不会调用命令操作,或者所有属性都将为null

答案 1 :(得分:11)

我认为问题在于简单上传并不支持ajax。 你应该添加ajax="false"

<h:form id="welcomeForm">
    <p:fileUpload value="#{fileUploadController.uploadedFile}" mode="simple" />
    <h:commandButton value="Submit" action="#{fileUploadController.submit}" ajax="false" />
    <h:message for="welcomeForm" />
</h:form> 

或者使用primefaces autouploader。

答案 2 :(得分:4)

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

解决了这个问题
<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

答案 3 :(得分:4)

试试这个:

<h:form id="welcomeForm" enctype="multipart/form-data">
    <p:fileUpload value="#{fileUploadController.uploadedFile}" mode="simple" />
    <h:commandButton value="Submit" action="#{fileUploadController.submit}" />
    <h:message for="welcomeForm" />
</h:form>

enctype="multipart/form-data"对于文件上传非常重要。)

public class FileUploadController {   

    private UploadedFile uploadedFile;

    public FileUploadController() {
    }       

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
    }

    public void submit() {    
        // Get information you from the uploaded file
        System.out.println("Uploaded file name : " + uploadedFile.getFileName());
    }

} 

uploadedFile.getFileName()用于获取文件名。

答案 4 :(得分:0)

我有同样的问题,只有一点点的东西救了我:

我做了所有互联网上关于主要面孔和文件上传的事情

在应用了所需的过滤器映射和所需的依赖项之后,我看到必须将调度程序信息添加到过滤器映射中:

<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>FacesServlet</servlet-name>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

<servlet>
    <servlet-name>FacesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

也许这个非常小的配置可以像我一样拯救生命,祝你好运!