【问题标题】:p:fileUpload does not set uploaded file in backing bean [duplicate]p:fileUpload 未在支持 bean 中设置上传的文件 [重复]
【发布时间】:2012-01-25 04:45:12
【问题描述】:

我遇到了 PrimeFaces 的<p:fileUpload> 的问题。我创建了一个 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()被调用,但结果如下:

INFO:上传的文件名:null

这是怎么引起的,我该如何解决?

【问题讨论】:

  • 3 个问题:您使用什么 Primefaces 版本?为什么使用简单上传?你为什么要写一个公共的默认构造函数?
  • 我测试了高级模式,但它不起作用。我用了 primefaces 3.0 m4

标签: jsf file-upload jsf-2 primefaces


【解决方案1】:

我遇到了同样的问题,只是一件小事救了我:

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

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

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

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

【讨论】:

    【解决方案2】:

    试试这个:

    <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()用于获取文件名。

    【讨论】:

      【解决方案3】:

      我认为问题在于简单上传不支持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 自动上传器。

      【讨论】:

      • 我还必须在我的 WEB-INF 中包含 commons-fileupload-1.xxjarcommons-io-2.x.jar /lib
      【解决方案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

      【讨论】:

        【解决方案5】:

        请阅读PrimeFaces User Guide&lt;p:fileUpload&gt; 章节。

        文件上传入门

        首先要做的是配置解析多部分请求的文件上传过滤器。 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>
        

        简单文件上传

        简单文件上传模式在传统模式下工作,文件输入的值应该是 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 来说是强制性的,以便能够将文件发送到服务器。为了从multipart/form-data 请求中提取数据,JSF 必须使用过滤器。如果没有它们中的任何一个,则不会调用命令操作,或者所有属性都将是 null

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 2011-11-23
        • 1970-01-01
        相关资源
        最近更新 更多