p:fileUpload 未在支持 bean 中设置上传的文件 [重复]

Posted

技术标签:

【中文标题】p:fileUpload 未在支持 bean 中设置上传的文件 [重复]【英文标题】:p:fileUpload does not set uploaded file in backing bean [duplicate] 【发布时间】: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 【参考方案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

【讨论】:

感谢您的回复,但我只想通知您,我已经测试了您发布的内容,但它不起作用。我使用了 primefaces 3.0 m4 和 glassfish 3.1.1 您没有说您使用的是哪个应用程序服务器,但我相信您遇到了我在How to use multipart/form-data encoding in application running on GlassFish 3.1.1 中报告的相同问题。罪魁祸首似乎是 GlassFish 中未实现的功能,将在版本 3.1.2 中实现,如 here 所示。 抱歉 - 您确实说您正在运行 GlassFish 3.1.1。 #-| 我猜你需要和我一样的解决方案,也就是将 commons-fileupload 和 commons-io 库添加到你的项目中,如How to use PrimeFaces p:fileUpload? Listener method is never invoked 的回答中所述。跨度>

以上是关于p:fileUpload 未在支持 bean 中设置上传的文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JSF/Prime(FileUpload 组件)multipart-form 不加载托管 bean 类参数

如何在 PrimeFaces fileUpload 中向 fileUploadListener 发送参数

未在bean定义上指定bean类

为啥该属性未在 Salesforce Apex 中设置?

PrimeNG之FileUpload

JSF2 commandButton 操作未在更新的片段中调用