t:inputFileUpload没有上传文件

时间:2012-05-25 12:18:32

标签: jsf file-upload richfaces myfaces tomahawk

我正在使用myfaces ExtensionFilter上传文件,但该文件未设置为我的bean进行进一步处理。

以下是代码:

<h:form id="uploadFileForm" enctype="multipart/form-data">
    <tom:inputFileUpload id="file" 
        value="#{paramUpload.uploadFile}">
        <f:valueChangeListener type="com.bosch.de.plcd.plugin.ParamFileUpload" />
    </tom:inputFileUpload>
    <a4j:commandButton value="#{tpMsgs.upload}"
        styleClass="button" action="#{paramUpload.uploadParamFile}"
        onclick="javascript:updateParentScreen();">
    </a4j:commandButton>
</h:form>

和web.xml配置如下

<filter>
    <filter-name>Extensions Filter</filter-name>
    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Extensions Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

由于UploadFile未设置为bean,我也尝试使用ValueChangeListener,从不使用它,它不是bean:)

Bean代码

public class ParamFileUpload implements ValueChangeListener {

    private UploadedFile uploadFile;

    public void uploadParamFile() {
        if(uploadFile != null) {
            LOGGER.info("File type: " + uploadFile.getContentType());
            LOGGER.info("File name: " + uploadFile.getName());
            LOGGER.info("File size: " + uploadFile.getSize() + " bytes");
        }
    }

    public UploadedFile getUploadFile() {
        return uploadFile;
    }

    public void setUploadFile(UploadedFile uploadFile) {
        this.uploadFile = (UploadedFile)uploadFile;
    }

    public void processValueChange(ValueChangeEvent event)
        throws AbortProcessingException {
        this.uploadFile = (UploadedFile) event.getNewValue();
    }
}

您是否看到我在这里可能缺少的任何其他配置?

1 个答案:

答案 0 :(得分:3)

使用当前的JSF和Tomahawk版本无法通过ajax上传文件。由JSF创建的Ajax请求不支持也不使用multipart/form-data。 Tomahawk不是基于ajax的组件库。请改用普通的命令按钮。

<h:commandButton value="#{tpMsgs.upload}"
    styleClass="button" action="#{paramUpload.uploadParamFile}"
    onclick="javascript:updateParentScreen();">
</h:commandButton>

对于即将推出的带有新<h:inputFile>组件的JSF 2.2,使用ajax上传文件的支持为scheduled

或者,您可以使用RichFaces自己的<rich:fileUpload>。根据所使用的RichFaces版本,它使用Flash或iframe hack来实现异步文件上传。