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.xxjar 和 commons-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 的<p: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>
简单文件上传
简单文件上传模式在传统模式下工作,文件输入的值应该是
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 类参数