钉钉小程序移动端下载文件的解决方案

钉钉小程序移动端下载文件的解决方案.

create by db on 2024-2-6 18:10:53

Recently revised in 2024-2-6 18:10:53

闲时要有吃紧的心思,忙时要有悠闲的趣味

目录

前言

返回目录

 最近在开发钉钉小程序的第三方企业应用,其中存在下载PDF文件的需求。

 关于移动端下载文件,钉钉小程序存在些坑,现在记录一下。

正文

一、问题出现

返回目录

 因为要在钉钉上开发第三方应用及H5页面,因此首要的就是看文档呗。

 在钉钉开放平台文档中,存在两API, dd.downloadFile以及FileSystemManager.saveFile,并且都支持程序。

 这不就妥了,现成可以用的。直接使用dd.downloadFile来下载文件,并使用FileSystemManager.saveFile将文件保存到本地,完美。

 用了之后就傻眼了,在移动端(包括安卓和IOS)两个API 调用都可以成功,然而文件却无法保存到手机上。

 经过一系列的尝试,确认钉钉小程序在移动端没办法直接下载文件,只能提工单找钉钉帮忙了。钉钉提工单的位置在钉钉开放平台,点击AI助理输入工单即可,具体位置

 在这要给钉钉的工单中心点个赞,恢复真的蛮及时的!

 经工单沟通,获悉

  1. dd.biz.util.downloadFile是微应用的jsapi非小程序的jsapi,并且仅支持pc端调用的,目前没有直接下载文件到手机内部的方案呢,使用小程序的文件管理器FileSystemManager.saveFile,保存到的是钉钉提供的小程序沙箱里,不是保存到手机设备里的。
  2. 下载API, 钉钉这边是没有的了 你可以参考外部的方法 下载预览 例如pdf.js插件
  3. 预览的话,可以转存文件到钉盘,再调用钉盘预览文件的接口来预览 ,没有直接预览的方案

二、解决方案

返回目录

 最终经过各方面了解,采取的解决方案为

  1. 转存钉盘相关API为dd.saveFileToDingTalk
  2. 调用钉盘预览文件的接口来预览:相关API为dd.previewFileInDingTalk
  3. 在预览界面有下载的方式,可以直接下载

三、上代码

  1. 因为我们是小程序H5页面,因此首先在使用H5向小程序通信,告知要下载的文件;非H5同学可以忽略此步骤
ts 复制代码
  const downloadFile = (url: string, name: string) => {
    // 判断当前是否处于钉钉环境
    if (navigator.userAgent.toLowerCase().indexOf("dingtalk") > -1) {
      // 下载dd资源
      if (!window.dd) {
        let script = document.createElement("script");
        script.src = "https://appx/web-view.min.js";
        script.async = true;
        document.head.appendChild(script);
      }
      // H5向钉钉小程序通信
      window.dd && window.dd.postMessage({ name, url });
    }
  };
  1. 在小程序web-view 组件中接受onMessage, 非H5同学可以忽略此步骤 首先是 webview.axml文件中,注册事件
html 复制代码
  <web-view id="web-view-1" src="{{src}}" onMessage="test"></web-view>

还有webview.js文件中

js 复制代码
  onLoad (options) {
    // 注册事件
    this.webViewContext = dd.createWebViewContext('web-view-1');
    // 更新路径
    if (options.src) {
      const src = decodeURIComponent(options.src)
      this.setData({
        src
      })
    }
  },
  test (e) {
    // 获取数据
    let { name, url } = e.detail
    // 保存至钉盘
    dd.saveFileToDingTalk({
      url,
      name,
      success: (res) => {
        const { data = [] } = res;
        if(!data.length) return
        const {
          fileId = "",
          fileName = "",
          fileSize = 0,
          fileType = "",
          spaceId = "" } = data[0]
          // 保存成功调起预览
        dd.previewFileInDingTalk({
          spaceId: spaceId,
          fileName: fileName,
          fileSize: fileSize,
          fileSize: fileType,
          fileId: fileId,
          success: () => {
            // console.log('预览成功===', data)
          },
          fail: () => {
            // console.log('预览失败===')
          },
          complete: () => {
            // console.log('结束===')
          },
        });
      },
      fail: () => { },
      complete: () => { },
    });
  },

总结

返回目录

 希望钉钉文档及生态越来越好,希望大家Bug越来越少!

 2024,开工大吉!

参考文档

后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址

文档协议


db 的文档库db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。

基于github.com/danygitgit上的作品创作。

本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by... 处获得。

相关推荐
SoaringHeart7 小时前
Flutter 进阶:NCanvasImageLoader 让 Canvas 也能画网络图
前端·flutter
计算机魔术师7 小时前
英伟达两个月叫停360亿美元生意:芯片巨头怕了反垄断?
前端
创新技术阁7 小时前
FastapiAdmin 前后端启动全流程详解
前端·后端·fastapi
七牛开发者7 小时前
实测推荐 3 个 Skill,轻松上手 Codex 网页设计与交付流程
前端·javascript·后端
七牛开发者7 小时前
拆解 dsh 系列:从源码和版本变化看 DeepSeek Harness 的设计取舍
前端·javascript·后端
谭光志8 小时前
如何从网站提取设计风格:DOM、计算样式与 DESIGN.md
前端·javascript·agent
深念Y8 小时前
登录日志与管理员审计日志存储决策
前端·arm开发·后端·微服务·云原生·架构
笨笨饿8 小时前
#121_图传中的H.364编码与MP4的联系
linux·运维·前端·单片机·嵌入式硬件·面试·职场和发展
默_笙9 小时前
☕ 我给 TS 类型做了台"瘦身手术",还顺手用 Docker 起了个 MySQL
前端·javascript
leoZ2319 小时前
AI+前端提效- 06 AI辅助调试排错:前端报错、白屏、兼容问题极速定位
前端·人工智能·chatgpt·状态模式·超分辨率重建·openvino·dreamfusion