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

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

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... 处获得。

相关推荐
轻口味1 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王2 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发2 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀2 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪3 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
ekskef_sef4 小时前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端
sunshine6415 小时前
【CSS】实现tag选中对钩样式
前端·css·css3
真滴book理喻5 小时前
Vue(四)
前端·javascript·vue.js
蜜獾云5 小时前
npm淘宝镜像
前端·npm·node.js