30.21. <w:fileupload>

HTML的文件上传标签功能简单,而且当文件过大时,用户无法知道文件的上传情况,用户很可能经过漫长的等待耗尽了耐性而放弃上传。而使用Fileupload构件则可以解决这些问题。

30.21.1. 构件信息

表 30.61. 构件信息

Component Typeorg.operamasks.faces.component.widget.UIFileUpload
Component Familyorg.operamasks.faces.widget.FileUpload
Component Classorg.operamasks.faces.component.widget.UIFileUpload
Tag Classorg.operamasks.faces.webapp.widget.UIFileUploadTag
Renderer Typeorg.operamasks.faces.component.widget.UIFileUpload
Renderer Class(AJAX)org.operamasks.faces.render.widget.ajax.AjaxFileUploadRenderer

继承体系

+java.lang.Object

++javax.faces.component.UIComponent

+++javax.faces.component.UIComponentBase

++++org.operamasks.faces.component.widget.base.UIFileUploadBase

+++++org.operamasks.faces.component.widget.UIFileUpload

30.21.2. 属性

表 30.62. 属性

binding 定义类 javax.faces.component.UIComponentBase
类型 javax.el.ValueExpression(javax.faces.component.UIComponent)
是否必须 延时求值
一个值表达式,用于把该组件链接到一个ManagedBean的某个属性。
browseIcon 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 javax.el.ValueExpression(java.lang.String)
是否必须 延时求值
构件选择按钮所使用的图片URL
id 定义类 javax.faces.component.UIComponentBase
类型 java.lang.String
是否必须 延时求值
这个组件的组件标识符。这个值在最近的命名容器类型的父组件范围内,必须是唯一的。
maxSize 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 javax.el.ValueExpression(java.lang.Long)
是否必须 延时求值
指定允许上传文件的最大值
rendered 定义类 javax.faces.component.UIComponentBase
类型 boolean(boolean)
是否必须 延时求值
一个标志,指出该组件是否要在任何随后的form提交过程中被渲染或处理。 这个属性的缺省值是true。
required 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 javax.el.ValueExpression(java.lang.Boolean)
是否必须 延时求值
构件值是否可以为空
requiredMessage 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 javax.el.ValueExpression(java.lang.String)
是否必须 延时求值
构件值为空时显示的错误信息
rich 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 javax.el.ValueExpression(java.lang.Boolean)
是否必须 延时求值
构件是否rich component,默认不是
style 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 javax.el.ValueExpression(java.lang.String)
是否必须 延时求值
构件渲染时应用到构件的CSS风格,对应于元素的style属性
styleClass 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 javax.el.ValueExpression(java.lang.String)
是否必须 延时求值
空格分隔的CSS风格类名列表,渲染时作为元素的"class"属性
uploadListener 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 java.lang.String
是否必须 延时求值
上传监听器
writeTo 定义类 org.operamasks.faces.component.widget.UIFileUpload
类型 javax.el.ValueExpression(java.lang.String)
是否必须 延时求值
放置上传文件的位置

30.21.3. 构件API

30.21.4. 示例

下面是FileUpload构件的一般用法,详细示例可参考 bpdemos

首先创建托管Bean:

@ManagedBean(name = "interact.fileUploadBean", scope = ManagedBeanScope.REQUEST)
public class FileUploadBean {
    private UIFileUpload fileUpload1;
    private String errorMessage;

    public void processUpload(FileUploadItem fileUploadItem) {
        if (fileUploadItem.getFieldName().equals("fileUpload1"))
            deleteOldFiles();

        InputStream input = null;
        FileOutputStream output = null;

        try {
            input = fileUploadItem.openStream();
            output = new FileOutputStream(new File(getSaveToPath(fileUploadItem)));
            byte[] buf = new byte[4096];
            // UIFileUpload.END_UPLOADING为-1,这里表示数据输入流已经读取完毕
            int length = UIFileUpload.END_UPLOADING;

            while ((length = input.read(buf)) != UIFileUpload.END_UPLOADING) {
                output.write(buf, 0, length);
            }
        } catch (IOException e) {
            throw new FacesException(e);
        } finally {
            if (output != null)
                try {
                    output.close();
                } catch (IOException e) {
                }
        }
    }

    ...... 

}

下面是页面代码:

<w:fileUpload id="fileUpload1" uploadListener="#{interact.fileUploadBean.processUpload}"
    binding="#{interact.fileUploadBean.fileUpload1}" rich="true" maxSize="100k"
    required="true" />
<br />
<w:fileUpload id="fileUpload2" uploadListener="#{interact.fileUploadBean.processUpload}"
    rich="false" maxSize="100k" />
<br />
<w:fileUpload id="fileUpload3" writeTo="#{interact.fileUploadBean.fileUpload3WriteTo}"
    rich="true" browseIcon="images/select.gif" maxSize="100k" />
<br />
<w:button action="#{interact.fileUploadBean.action}" value="Upload" />
<w:fileUploadProgress startMessage="开始上传"
    uploadingMessage="正在上传,已经上传{readBytes}k/{total}k({percentage}%)"
    completeMessage="上传结束,总共{total}k" errorMessage="上传错误:{error}" />