You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在RichFaces 3.3的rich:fileUpload中初始化默认客户端文件?

在RichFaces 3.3的rich:fileUpload中客户端初始化展示默认文件

我之前在RichFaces 3.3项目里折腾过一模一样的需求——要在fileUpload组件里默认展示一个已经存在于服务端的文件,纯客户端操作不需要重新上传。一开始跟你一样,随便构造个对象调用add()方法根本没用,后来摸清楚了组件的JS内部逻辑才搞定,给你分享下可行的步骤:

1. 先正确获取组件的JS实例

RichFaces 3.3的组件实例不能直接用jQuery的.component()方法获取,得用框架自带的RichFaces.$()方法,传入组件的客户端ID(注意是JSF渲染后生成的完整ID,比如如果组件在myForm表单里,ID就是myForm:fileUploadId):

// 替换成你的fileUpload组件的客户端ID
var uploadComponent = RichFaces.$('myForm:defaultFileUpload');

2. 构造符合组件要求的文件对象

组件的add()方法需要的不是随便写的对象,得包含几个关键属性,不然组件没法正确渲染:

var defaultFile = {
    id: 'default-file-' + Date.now(), // 必须唯一,用来标识这个文件项
    name: '已存在的文件名.pdf', // 服务端文件的实际名称
    size: 102400, // 文件大小(字节),显示用,尽量填真实值
    state: 'uploaded', // 状态设为uploaded,组件会显示已上传的样式(比如打勾)
    url: '/download/existing-file' // 可选:如果要让用户能下载,填文件的服务端下载路径
};

3. 调用组件方法并刷新UI

光调用add()还不够,得把文件对象加入组件的内部文件列表,然后强制刷新UI:

// 添加文件到组件
uploadComponent.add(defaultFile);
// 将文件对象存入组件的内部文件数组
uploadComponent.files.push(defaultFile);
// 强制刷新组件的UI展示
uploadComponent.render();

4. 确保在组件初始化完成后执行代码

这段JS必须等页面加载完成、fileUpload组件初始化好之后再执行,所以最好放在jQuery的ready回调里:

jQuery(document).ready(function() {
    // 上面的获取实例、构造对象、添加文件的代码都放这里
});

额外优化:支持下载默认文件

如果需要让用户能点击下载这个默认文件,你得自定义组件的itemTemplate。先创建一个模板文件(比如fileUploadItem.xhtml):

<div class="rf-fu-itm">
    <span class="rf-fu-itm-lbl">#{file.name}</span>
    <span class="rf-fu-itm-sz">(#{file.size} bytes)</span>
    <!-- 新增下载链接 -->
    <a href="#{file.url}" target="_blank" class="rf-fu-itm-dwnl">下载</a>
    <span class="rf-fu-itm-st" style="display:none">#{file.state}</span>
    <span class="rf-fu-itm-act">
        <span class="rf-fu-itm-cntrl">
            <span class="rf-fu-itm-del" onclick="#{rich:component('myForm:defaultFileUpload')}.remove('#{file.id}')">删除</span>
        </span>
    </span>
</div>

然后在你的rich:fileUpload组件里引用这个模板:

<rich:fileUpload id="defaultFileUpload" 
                 itemTemplate="/path/to/fileUploadItem.xhtml"
                 <!-- 其他原有属性 -->
                 >
</rich:fileUpload>

注意事项

  • 客户端ID一定要准确:可以通过浏览器的开发者工具查看组件的实际ID,避免因为表单前缀导致找不到组件。
  • 页面刷新后默认文件会消失:如果需要每次加载都显示,得在页面加载时从服务端获取文件的名称、大小等信息,再动态生成JS代码执行。
  • 这个方案是纯客户端展示:如果用户删除这个默认文件,只是客户端移除,不会影响服务端的文件;如果需要同步服务端状态,得额外加AJAX逻辑。

内容的提问来源于stack exchange,提问作者Allan Lemes

火山引擎 最新活动