如何限制RichFaces 4 rich:fileUpload到单个文件上传?

时间:2011-12-07 15:22:32

标签: jsf file-upload jsf-2 richfaces

我正在使用RichFaces4中的<rich:fileUpload />,因为您可以看到here。 但正如你所看到的,用户可以选择很多图片,但我希望他只能选择一张图片。

如何在上传完成后调用托管bean中的方法(将图像发送到我的Amazon S3存储桶)?

修改

<ui:composition>
<h:outputStylesheet>
    .top {
        vertical-align: top;
    }

    .info {
        height: 202px;
        overflow: auto;
    }

    .rf-fu-lst {
        height: 60px;
    }

    .rf-fu-itm {
        border: 0;
    }
</h:outputStylesheet>
<h:outputScript target="head">
jQuery.extend(RichFaces.ui.FileUpload.prototype, {
    __updateButtons: function() {
        if (!this.loadableItem && this.list.children(".rf-fu-itm").size()) {
            if (this.items.length) {
                this.uploadButton.css("display", "inline-block");
                this.addButton.hide();
            } else {
                this.uploadButton.hide();
                this.addButton.css("display", "inline-block");
            }
        } else {
            this.uploadButton.hide();
            this.addButton.css("display", "inline-block");
        }
    }
});
</h:outputScript> 

    <h:form id="form_user_upload_picture" >
        <h:panelGrid columns="2" columnClasses="top, top">
            <rich:fileUpload  
                id="upload" 
                fileUploadListener="#{user_file_upload.listener}"
                acceptedTypes="jpg, gif, png, bmp" 
                addLabel="Adicionar" 
                clearAllLabel="Limpar todas" 
                clearLabel="limpar" 
                deleteLabel="apagar" 
                doneLabel="upload realizado" 
                sizeExceededLabel="arquivo muito grande, tente um arquivo de tamanho menor" 
                serverErrorLabel="ocorreu um erro em nosso servidor, tente novamente por favor"
                uploadLabel="Enviar">

                <a4j:ajax event="uploadcomplete" execute="@none" render="picture" />
            </rich:fileUpload>
        </h:panelGrid>

    </h:form>
</ui:composition>

1 个答案:

答案 0 :(得分:4)

这在RF 3.3中得到了支持。但是为了节省RF 4.0迁移的时间,<rich:fileUpload>得到的关注要少得多。目前有很多open tickets可以改进它。

直到他们改进它,你当前最好的选择是引入一些自定义的jQuery / JS和CSS来实现选择和上传一个文件的功能要求。

此脚本通过在已选择文件时隐藏添加按钮来阻止最终用户上传多个文件:

jQuery.extend(RichFaces.ui.FileUpload.prototype, {
    __updateButtons: function() {
        if (!this.loadableItem && this.list.children(".rf-fu-itm").size()) {
            if (this.items.length) {
                this.uploadButton.css("display", "inline-block");
                this.addButton.hide();
            } else {
                this.uploadButton.hide();
                this.addButton.css("display", "inline-block");
            }
        } else {
            this.uploadButton.hide();
            this.addButton.css("display", "inline-block");
        }
    }
});

确保在 RF默认脚本(包括jQuery之后)上载了上述JS。您可以通过身体中的<h:outputScript>执行此操作,如果需要,您可以使用target="head"进行设置。

此CSS限制文件列表的高度,并删除单个项目的下边框:

.rf-fu-lst {
    height: 60px;
}
.rf-fu-itm {
    border: 0;
}

确保在 RF默认样式后加载上面的CSS。你可以通过身体中的<h:outputStylesheet>来做到这一点(所以不要放在头上)。


  

如何在上传完成后调用托管bean中的方法(将图像发送到我的Amazon S3存储桶)?

只需在附加到fileUploadListener属性的侦听器方法中执行该作业。

<rich:fileUpload fileUploadListener="#{bean.upload}">