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


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 相关文章推荐
用js做一个小游戏平台 (一)
Dec 29 Javascript
jQuery 三击事件实现代码
Sep 11 Javascript
connect中间件session、cookie的使用方法分享
Jun 17 Javascript
JS实现的仿QQ空间图片弹出效果代码
Feb 23 Javascript
JS计算两个时间相差分钟数的方法示例
Jan 10 Javascript
如何在vue中使用ts的示例代码
Feb 28 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
Jan 27 jQuery
微信小程序实现的一键拨号功能示例
Apr 24 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
Nov 17 Javascript
jQuery 实现扁平式小清新导航
Jul 07 jQuery
CentOS 8.2服务器上安装最新版Node.js的方法
Dec 16 Javascript
js前端设计模式优化50%表单校验代码示例
Jun 21 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
来自qq的javascript面试题
2010/07/24 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
微信小程序分页加载的实例代码
2017/07/11 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
python迭代器实例简析
2014/09/25 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
python批量处理txt文件的实例代码
2020/01/13 Python
python如何实现图片压缩
2020/09/11 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
医学院四年学习生活的自我评价
2013/11/06 职场文书
招聘单位介绍信
2014/01/14 职场文书
大型车展策划方案
2014/02/01 职场文书
会议邀请书范文
2014/02/02 职场文书
采购部部长岗位职责
2014/02/06 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
工业设计专业自荐书
2014/06/05 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书
my.ini优化mysql数据库性能的十个参数(推荐)
2021/05/26 MySQL
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python
Python创建SQL数据库流程逐步讲解
2022/09/23 Python