钉钉小程序 - - - - - 常见文件附件预览逻辑


这篇只讲文件附件的预览链路。
页面模板负责把点击入口绑好,真正的预览逻辑在 JS 里完成。

1. 页面渲染

  <view
    a:for="{{item.value}}"
    a:for-item="file"
    data-url="{{file.url}}"
    data-name="{{file.value_name}}"
    catchTap="openLink"
  >
    {{file.value_name}}
  </view>

file 只展示文件名,点击后通过 data-urldata-name 把文件信息传给 openLink

2. 文件预览流程

文件点击后会走 openLink,流程可以概括成三步:先转存,再校验,最后预览。

openLink(e) {
  const { url, name } = e.target.dataset; // name的格式应该是 xxxx.pdf/excel 等带后缀的
  if (!url) return;

  dd.showLoading({ content: '文件转存中...' });
  dd.saveFileToDingTalk({
    url,
    name: name || '',
    success: (res) => {
      dd.hideLoading();
      const [fileInfo = {}] = res.data || [];
      const { spaceId, fileId, fileName, fileSize, fileType } = fileInfo;
      if (!spaceId || !fileId) return dd.showToast({ type: 'fail', content: '文件转存失败' });

      dd.previewFileInDingTalk({
        corpId: dd.corpId,
        spaceId,
        fileId,
        fileName: fileName || name || '',
        fileSize,
        fileType,
        fail(err) {
          dd.showToast({ type: 'fail', content: (err && err.errorMessage) || '文件预览失败' });
        },
      });
    },
    fail(err) {
      dd.hideLoading();
      dd.showToast({ type: 'fail', content: (err && err.errorMessage) || '文件转存失败' });
    },
  });
}

这里的关键点是:文件不是直接拿原始 URL 打开,而是先调用 dd.saveFileToDingTalk 转存到平台侧,再用返回的 spaceIdfileId 去预览。这样做的好处是兼容平台内部的文件预览能力,也能统一兜底失败提示。

3. 这个方案的特点

  1. 模板层只负责展示和绑定事件,不写复杂逻辑。
  2. 文件先转存再预览,兼容平台文件能力。
  3. 每一步都有兜底提示,避免用户看到空白或无响应。

4. 小结

这套 file 附件预览其实就是把“展示”、“转存”、“预览”拆开处理:

  • 展示层决定用户看到什么
  • 转存层解决平台兼容问题
  • 预览层负责最终交互体验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值