微信小程序之多文件下载的简单封装示例


Posted in Javascript onJanuary 29, 2018

需求

需要生成一个宣传的图片分享到朋友圈,这个宣传图片包含二维码,包含不同的背景图片和不同的文字。对于这种图片生成,我们考虑过使用服务端生成,但是这样会比较耗服务器性能,所以最终决定使用本地生成。

首先小程序有一个限制,包不能大于2m,而且我们可能多个背景图,所以计划把背景图和二维码图片放在服务端,这样可以减少小程序包的大小,也可以灵活的切换背景图。

在绘制分享图的时候,可以直接使用互联网地址,但是遇到了一个问题,有可能不能生成图片,所以我们需要把这个图片文件下载下来。

下载文件的方法微信有API,但是返回的是文件的临时路径,只在小程序本次启动期间可以正常使用,如需持久保存,需在主动调用 wx.saveFile,才能在小程序下次启动时访问得到。

所以我们先把下载文件和保存文件封装

封装下载并且保存一个文件

这个方法比较简单

参数:一个对象,包含

  1. id 需要下载文件的id,如果不传默认是下载的url,之所以需要id,是因为我们要做多文件下载,可以区分下载的是一个文件
  2. url 下载文件的网络地址(需要微信小程序后台配置,具体配置方法请参考微信官方文档)
  3. success 成功回调 返回参数是一个对象 包含 id,savedFilePath
  4. fail 失败回调 ,下载失败,保存都是都算失败
/**
 * 下载保存一个文件
 */
function downloadSaveFile(obj) {
  let that = this;
  let success = obj.success;
  let fail = obj.fail;
  let id = "";
  let url = obj.url;
  if (obj.id){
    id = obj.id;
  }else{
    id = url;
  }
  // console.info("%s 开始下载。。。", obj.url);
  wx.downloadFile({
    url: obj.url,
    success: function (res) {
      wx.saveFile({
        tempFilePath: res.tempFilePath,
        success: function (result) {
          result.id = id;
          if (success) {
            success(result);
          }
        },
        fail: function (e) {
          console.info("保存一个文件失败");
          if (fail) {
            fail(e);
          }
        }
      })
    },
    fail: function (e) {
      console.info("下载一个文件失败");
      if (fail) {
        fail(e);
      }
    }
  })
}

使用下载方法(wx.downloadFile(obj))需要在微信小程序配置服务器域名,服务器域名请在 小程序后台-设置-开发设置-服务器域名 中进行配置 ,具体请参考 微信官方文档

封装多文件下载并且保存

多文件下载并且保存,强制规定,必须所有文件下载成功才算返回成功

参数:一个对象,包含

  1. urls 下载地址 数组,支持多个 url下载 [url1,url2]
  2. success 下载成功 (必须所有文件下载成功才算返回成功) 回调参数 map ,key(id) -> value ({id,savedFilePath})
  3. fail 下载失败,只要有一个方法失败就调用失败
/**
 * 多文件下载并且保存,强制规定,必须所有文件下载成功才算返回成功
 */
function downloadSaveFiles(obj) {
  // console.info("准备下载。。。");
  let that = this;
  let success = obj.success; //下载成功
  let fail = obj.fail; //下载失败
  let urls = obj.urls; //下载地址 数组,支持多个 url下载 [url1,url2]
  let savedFilePaths = new Map();
  let urlsLength = urls.length; // 有几个url需要下载
  for (let i = 0; i < urlsLength; i++) {
    downloadSaveFile({
      url: urls[i],
      success: function (res) {
        //console.dir(res);
        //一个文件下载保存成功
        let savedFilePath = res.savedFilePath;
                
        savedFilePaths.set(res.id, res);
        console.info("savedFilePath:%s", savedFilePath);
        if (savedFilePaths.size == urlsLength) { //如果所有的url 才算成功
          if (success){
            success(savedFilePaths)
          }
          
        }
      },
      fail: function (e) {
        console.info("下载失败");
        if (fail) {
          fail(e);
        }

      }
    })
  }
}

完整的download.js文件

/**
 * 下载管理器
 * Created by 全科 on 2018/1/27.
 */
/**
 * 下载保存一个文件
 */
function downloadSaveFile(obj) {
  let that = this;
  let success = obj.success;
  let fail = obj.fail;
  let id = "";
  let url = obj.url;
  if (obj.id){
    id = obj.id;
  }else{
    id = url;
  }
  // console.info("%s 开始下载。。。", obj.url);
  wx.downloadFile({
    url: obj.url,
    success: function (res) {
      wx.saveFile({
        tempFilePath: res.tempFilePath,
        success: function (result) {
          result.id = id;
          if (success) {
            success(result);
          }
        },
        fail: function (e) {
          console.info("保存一个文件失败");
          if (fail) {
            fail(e);
          }
        }
      })

    },
    fail: function (e) {
      console.info("下载一个文件失败");
      if (fail) {
        fail(e);
      }

    }
  })
}
/**
 * 多文件下载并且保存,强制规定,必须所有文件下载成功才算返回成功
 */
function downloadSaveFiles(obj) {
  // console.info("准备下载。。。");
  let that = this;
  let success = obj.success; //下载成功
  let fail = obj.fail; //下载失败
  let urls = obj.urls; //下载地址 数组,支持多个 url下载 [url1,url2]
  let savedFilePaths = new Map();
  let urlsLength = urls.length; // 有几个url需要下载
  for (let i = 0; i < urlsLength; i++) {
    downloadSaveFile({
      url: urls[i],
      success: function (res) {
        console.dir(res);
        //一个文件下载保存成功
        let savedFilePath = res.savedFilePath;                
        savedFilePaths.set(res.id, res);
        console.info("savedFilePath:%s", savedFilePath);
        if (savedFilePaths.size == urlsLength) { //如果所有的url 才算成功
          if (success){
            success(savedFilePaths)
          }          
        }
      },
      fail: function (e) {
        console.info("下载失败");
        if (fail) {
          fail(e);
        }
      }
    })
  }
}
module.exports = {
  downloadSaveFiles: downloadSaveFiles
}

使用

首先导入

import download from "download.js"

之后调用

let url1 = 'https://xcx.upload.utan.com/article/coverimage/2018/01/25/eyJwaWMiOiIxNTE2ODU2Nzc0Njk3OCIsImRvbWFpbiI6InV0YW50b3V0aWFvIn0=';
let url2 = 'https://xcx.upload.utan.com/article/coverimage/2018/01/26/eyJwaWMiOiIxNTE2OTcyNDg0NDUzOSIsImRvbWFpbiI6InV0YW50b3V0aWFvIn0=';
download.downloadSaveFiles({
  urls: [url1, url2],
  success: function (res) {
    // console.dir(res);
   
    console.info(res.get(url2).savedFilePath)
  },
  fail: function (e) {
    console.info("下载失败");
  }
);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Java 正则表达式学习总结和一些小例子
Sep 13 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
浅析Js中的单引号与双引号问题
Nov 06 Javascript
详解JavaScript中undefined与null的区别
Mar 29 Javascript
初识SmartJS - AOP三剑客
Jun 08 Javascript
简介JavaScript中的setDate()方法的使用
Jun 11 Javascript
JavaScript简单下拉菜单实例代码
Sep 07 Javascript
jQuery  ready方法实现原理详解
Oct 19 Javascript
关于定制FileField中的上传文件名称问题
Aug 22 Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 Javascript
Element input树型下拉框的实现代码
Dec 21 Javascript
React+Antd+Redux实现待办事件的方法
Mar 14 Javascript
JS中Object对象的原型概念基础
Jan 29 #Javascript
vue.js实现只弹一次弹框
Jan 29 #Javascript
javascript trie前缀树的示例
Jan 29 #Javascript
Vue官网todoMVC示例代码
Jan 29 #Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
Jan 29 #jQuery
Angular2 父子组件通信方式的示例
Jan 29 #Javascript
jQuery代码优化方法总结
Jan 29 #jQuery
You might like
php页面消耗内存过大的处理办法
2013/03/18 PHP
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
js 单引号 传递方法
2009/06/22 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
python IP地址转整数
2020/11/20 Python
医学专业个人求职自荐信格式
2013/09/23 职场文书
2014信息公开实施方案
2014/02/22 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
师德师风的心得体会
2014/09/02 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
spring boot中nativeQuery的用法
2021/07/26 Java/Android
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫
python playwright之元素定位示例详解
2022/07/23 Python