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


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 相关文章推荐
jquery中ajax学习笔记一
Oct 16 Javascript
javascript 判断整数方法分享
Dec 16 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
Jan 14 Javascript
使用bootstrap3开发响应式网站
May 12 Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
Nov 03 Javascript
Angular5中调用第三方js插件的方法
Feb 26 Javascript
js实现动态增加文件域表单功能
Oct 22 Javascript
javascript对HTML字符转义与反转义
Dec 13 Javascript
Node.js实现简单管理系统
Sep 23 Javascript
小程序实现列表展开收起效果
Jul 29 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设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
jqPlot Option配置对象详解
2009/07/25 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
Python标准库与第三方库详解
2014/07/22 Python
python循环监控远程端口的方法
2015/03/14 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
tensorflow 变长序列存储实例
2020/01/20 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
导致python中import错误的原因是什么
2020/07/01 Python
python 线程的五个状态
2020/09/22 Python
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
Python合并pdf文件的工具
2021/07/01 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python