【发布时间】:2013-09-15 20:15:28
【问题描述】:
我正在使用,
- GlassFish 4.0
- JSF 2.2
- Mojarra 2.2.0
- Primefaces 3.5
我在 XHTML 页面上有这个 fileUpload 组件。
<h:form enctype="multipart/form-data">
<p:fileUpload id="txtCatImage"
value="#{testManagedBean.uploadedFile}"
mode="advanced"
sizeLimit="100000"
multiple="false"
showButtons="true"
allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
fileUploadListener="#{testManagedBean.fileUploadListener}"/>
<p:message for="txtCatImage" showSummary="false"/>
<p:commandButton id="btnSubmit"
actionListener="#{testManagedBean.insert}"
icon="ui-icon-check" value="Save"/>
</h:form>
这是对应的托管 bean。
@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable {
private UploadedFile uploadedFile;
private static final long serialVersionUID = 1L;
public TestManagedBean() {}
public UploadedFile getUploadedFile() {
return uploadedFile;
}
public void setUploadedFile(UploadedFile uploadedFile) {
this.uploadedFile = uploadedFile;
}
public void fileUploadListener(FileUploadEvent event) {
uploadedFile = event.getFile();
System.out.println("fileUploadListener invoked.");
}
public void insert() {
if (uploadedFile != null) {
System.out.println(uploadedFile.getFileName());
} else {
System.out.println("The file object is null.");
}
}
}
前面提到的文件上传监听器 - fileUploadListener() 永远不会被调用。
文件上传过滤器在web.xml中映射如下。
<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>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
我已将Apache-commons-fileupload 和Apache-commons-io 添加到类路径中。同样的事情在我早期的 Spring / JSF 项目中也有效。
我看不到我在这里缺少什么。是不是跟服务器的版本有关系?
【问题讨论】:
-
我已将 Apache-commons-fileupload 和 Apache-commons-io 添加到类路径中。 你是如何完成这一步的?有很多方法可以做到这一点,而其中许多方法对于 WAR 来说是完全错误的。您是否确认这些 JAR 确实最终位于构建/部署的 WAR 文件的
/WEB-INF/lib文件夹中? -
我刚刚检查了它们。部署应用程序后,两个 jar 文件都存在于
$Project/Project-war/build/web/WEB-INF/lib -
好的。如果您删除/禁用所有与安全相关的过滤器和东西怎么办? (只是为了排除它们成为原因)如果您尝试 JSF 2.1 会怎样? (JSF 2.2 自带了自己的原生文件上传解析器,不确定 PrimeFaces 3.5 是如何作用的,我自己从未尝试过)。
-
我尝试了与在 Mojarra 2.1.6、JSF 2.1 和 PrimeFaces 3.5 上运行的 GlassFish 3.1.2 的问题相同的场景。它可以正常工作。
-
在 GlassFish 4.0 上通过禁用安全过滤器和安全约束进行了尝试,但没有奏效。
标签: jsf file-upload jsf-2 primefaces