我遇到了<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
这是如何引起的?如何解决?
答案 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>
也许这个非常小的配置可以像我一样拯救生命,祝你好运!