HTML的文件上传标签功能简单,而且当文件过大时,用户无法知道文件的上传情况,用户很可能经过漫长的等待耗尽了耐性而放弃上传。而使用Fileupload构件则可以解决这些问题。
表 30.61. 构件信息
| Component Type | org.operamasks.faces.component.widget.UIFileUpload |
| Component Family | org.operamasks.faces.widget.FileUpload |
| Component Class | org.operamasks.faces.component.widget.UIFileUpload |
| Tag Class | org.operamasks.faces.webapp.widget.UIFileUploadTag |
| Renderer Type | org.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.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) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 放置上传文件的位置 | ||||
下面是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}" />