我的问题是我无法使用JSF表格上传文件。有我的组件代码:
<h:form id="uploadForm" enctype="multipart/form-data">
<h:panelGrid>
<h:inputText id="filenameInput"
value="#{uploadBean.filename}"
required="true"
requiredMessage="Filename is required"/>
<p:message for="filenameInput"/>
<h:inputFile id="fileInput"
label="inputFile"
value="#{uploadBean.file}"
validator="#{uploadBean.validateFile}"/>
<p:message for="fileInput"/>
<h:commandButton id="submitBtn"
value="Upload file"
actionListener="#{uploadBean.uploadFile()}">
<f:ajax execute="@form" render="uploadForm"/>
</h:commandButton>
</h:panelGrid>
</h:form>
uploadBean的实现:
import org.springframework.stereotype.Component;
import org.springframework.context.annotation.Scope;
import javax.servlet.http.Part;
@Component
@Scope("view")
public class UploadBean {
private Part file;
private String filename;
public void uploadFile() throws IOException {
if (file != null && filename != null && !filename .isEmpty()) {
// Some processing
}
}
只是要指出我正在使用的库的确切版本,请参阅下面的一些gradle导入:
compile group: 'org.omnifaces', name: 'omnifaces', version: '1.7'
compile group: 'com.sun.faces', name: 'jsf-api', version: '2.2.6'
compile group: 'com.sun.faces', name: 'jsf-impl', version: '2.2.6'
compile group: 'org.primefaces', name: 'primefaces', version: '5.3'
compile group: 'org.springframework.boot', name: 'spring-boot-starter'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web'
如果从h:form中删除了enctype(以及h:inputFile和p:message),则提交表单,对剩余字段进行验证并且一切似乎都没问题。但显然我需要那个文件。
如果没有更改任何内容并且使用上面显示的代码版本,那么我可以在服务器日志中看到一些操作,但是页面没有重新加载,浏览器中没有任何实际发生(甚至在控制台中)。如果我第二次单击按钮而不重新加载页面,那么绝对没有任何反应。
另一个有趣的事情是它适用于生产服务器,但不适用于开发和本地。我知道的唯一区别是生产使用外部Tomcat实例,但开发和本地应用程序适用于Spring的嵌入式Tomcat。不幸的是,这是一个遗留代码,我对生产没有更多了解 - 整个开发团队已经交换,我没有直接访问(很糟糕)。