5.11. 新增构件:Flash文件上传构件、文件下载构件

5.11.1. Flash上传构件

现如今,如果想拥有更强大的文件上传功能,Flash + JavaScript 无疑是一个理想的组合。OperaMasks便整合了这方面的佼佼者----开源构件swfupload,并由此提供了<w:swfUpload>构件,此构件提供了文件过滤、多文件上传、进度条等等功能。下面就来体验一下:

<w:swfUpload fileTypes="*.jpg;*.png" swfUploadListener="#{bean.process}" fileSizeMax="10MB" fileQueueLimit="1">
</w:swfUpload>

相信很容易看明白,上述配置允许上传的后缀为"jpg"和"png"的文件,文件最大为"10MB",只允许上传单文件。运行结果如下:

除了这些常规配置,<w:swfUpload>构件还提供了一些回调方法,供用户定制事件的处理方法。如

<w:swfUpload swfUploadListener="#{bean.process}" ondialogstart="alert('dialog started!');">
</w:swfUpload>

5.11.2. 文件下载构件

Operamasks 3.0版本中增加一个下载构件<om:downloadFile>,它具有以下属性:

  • id: 构件id。

  • src: 下载源。类型可为字符串(指明下载资源的URL)、java.net.URL,File、InputStream、byte[]。

  • downloadListener: 指定LiteBean上的一个监听方法,用于直接向ResponseStream中写入下载内容。方法签名必须为:public void 任意方法名称(FacesContext context, ResponseStream stream); 如果同时指定了src与downloadListener属性,以downloadListener为准。如果两者均未指定(src返回null),则抛出IllegalStateException异常。

  • savedName: 默认的保存文件名。如未指定,则使用下载源的文件名。如下载源并无实体文件,则使用UUID算法随机生成一个默认文件名。

  • contentType: 内容类型,默认为 application/octet-stream。

  • bufferSize: 用于指定下载时ResponseStream的缓存区大小,如未指定,以系统当前值为准。。

  • for: 用于指定一个ActionSource构件,当此构件引起提交动作时,自动激发下载动作。(如未指定本属性,则需要在服务器处理逻辑中显式调用构件类上的 download()方法来激发下载动作)。

加入构件类UIFileDownload,在后台代码中绑定此构件并调用构件类上download方法,可触发该构件实例指定的下载动作。

主要有两种用法。用法1:使用for属性自动触发下载

<w:form>
    <w:button id="action1" label="下载文档"/>
    <om:fileDownload id="filedown" for="action1" src="readme.txt"/>
</w:form>

用法2:使用构件API触发下载

<w:form>
    <w:button id="action1" label="下载文档"/>
    <om:fileDownload id="filedown" savedName="test.txt"/>
</w:form>
@Bind
UIFileDownload filedown;

@Action
private void action1() {
    filedown.download();
}

@DownloadListener(id="filedown")
private void processDownload(FacesContext context, ResponseStream stream) {
    try {
      for (int i = 1; i < 1024; i++) {
        stream.write(65);
      }
      stream.flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
}