这是我第一次使用h:inputFile,我遇到了一些麻烦。
我的Managed Bean中Part属性的setter方法永远不会被调用,因此当调用upload方法时,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过滤器(我已尝试删除它,测试过并没有成功)。
答案 0 :(得分:2)
经过多次尝试,在部署了一个只有默认值的新项目之后(就像@BalusC在我的问题评论中所说的那样),我发现问题是web.xml中的PrimeFaces FileUploadFilter !! 强>
之前我已经摆脱它,但我不知道为什么那段时间没有工作,可能是Eclipse提供的项目部署刷新的一些问题。
但是现在我再次尝试了它的确有效!
感谢@BalusC的帮助!
答案 1 :(得分:0)
感谢BalusC和Diego Marques!我的应用程序遇到了类似的问题,它部署在Tomcat 8上 - h:inputFile值&#34; Part&#34;塞特从未被召唤过。您的帮助向我指出了一些已经发现我的问题实际上是Tomcat设置的库。
如果将它包含在此处也有帮助,Tomcat(可能还有Glassfish)需要以下设置才能使其符合规范&#34;。
<Context allowCasualMultipartParsing="true"
https://github.com/ocpsoft/rewrite/issues/136
您可以使用@MultipartConfig(和@WebServlet)标记您的bean,而不是执行上述上下文设置。