在JSF 2.2中上传文件

时间:2016-08-26 08:34:52

标签: spring jsf file-upload primefaces spring-boot

我的问题是我无法使用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。不幸的是,这是一个遗留代码,我对生产没有更多了解 - 整个开发团队已经交换,我没有直接访问(很糟糕)。

0 个答案:

没有答案