【发布时间】:2016-06-22 13:21:39
【问题描述】:
这是我第一次使用 h:inputFile,但遇到了一些麻烦。
我的 Managed Bean 中的 Part 属性的 setter 方法从不被调用,所以当调用上传方法时,Part 对象始终为 null。
表单和 inputFile 组件
<h:form enctype="multipart/form-data">
<div class="pic add-pic">
<h:inputFile id="upload-test" required="true"
value="#{uploadController.uploadedFile}">
</h:inputFile>
<h:commandLink styleClass="pic add-pic"
action="#{uploadController.addPic()}">
<i class="fa fa-plus"></i>
<span>Add pic</span>
</h:commandLink>
</div>
</h:form>
托管 Bean
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.servlet.http.Part;
@ManagedBean
@ViewScoped
public class UploadController {
private Part uploadedFile;
public Part getUploadedFile() {
return this.uploadedFile;
}
public void setUploadedFile(Part uploadedFile) {
this.uploadedFile = uploadedFile;
}
public void addPic() {
System.out.println("Uploaded a file: " +
uploadedFile.getSubmittedFileName());
}
}
我已经在 inputFile 中尝试过使用 ajax
<h:inputFile id="upload-test" required="true"
value="#{uploadController.uploadedFile}">
<f:ajax execute="@form" listener="#{uploadController.addPic()}" />
</h:inputFile>
并在 commandLink 中使用 ajax
<h:commandLink styleClass="pic add-pic">
<i class="fa fa-plus"></i>
<span>Add pic</span>
<f:ajax execute="@form" listener="#{uploadController.addPic()}" />
</h:commandLink>
但是这两个选项都没有效果。
PS:我正在使用 javax.servlet-api 3.1 版和 JSF 2.2.12 (Mojarra) 并在 Wildfly 9.0.2 上运行
PS2:我也在使用 Primefaces(在这种情况下不是),并且我的 web.xml 中有 fileUpload 过滤器(我试图删除它,经过测试但没有成功) .
【问题讨论】:
-
您不应该将 Servlet API 捆绑在 webapp 中。您不应该将 JSF API/impl 捆绑在 webapp 中。您不应该在 webapp 中配置 PrimeFaces FileUploadFilter。请确认您已将它们全部清除。当不确定时,只需从头开始创建一个完全空的测试项目,不要触摸库/默认值。
-
哦,对不起,如果我把它们捆绑在一起,我只是想展示我正在使用的版本,它们没有捆绑。我已经摆脱了 PrimeFaces 过滤器,但问题仍然存在
-
问题在目前提供的信息中不可见。确定您没有嵌套表单或使用自定义/第 3 方过滤器?复制粘贴到临时项目中时,您的代码可以正常工作。