微信小程序开发 -- 通过云函数下载任意文件

1.云开发介绍

​ 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开发上线也没多久,使用的人也不是很多,我抱着尝试的态度去接触了云开发,发现了云开发的妙处。(自由)

blog:微信小程序HTTP访问链接解决方案

2.小程序文件下载限制

微信小程序除了对访问地址有限制之外,对于文件下载,也存在的限制,如下图所示,只有资源服务器A,在downloadFile域名白名单内且配置了SSL访问,即HTTPS才可以正常的下载资源。(闲的蛋疼,饱受诟病)

![](https://gitee.com/Kindear/BlogAssets/raw/master/cnblogs/未命名文件 (15).png)

3.云函数下载任意文件设计

依然秉持着对云开发的信任,尝试使用云函数进行任意文件下载,设计思路如下图所示。

![](https://gitee.com/Kindear/BlogAssets/raw/master/cnblogs/未命名文件 (16).png)

上图描述的两种通过云函数下载文件的方式

  1. 云函数只作为一个数据中转节点,请求资源转化为Buffer直接返回给小程序端。
  2. 云函数作为存储器,下载资源存储到云空间,并返回给小程序端fileID(置换下载地址)。

4.云函数实现方式

通过请求头配置实现请求资源文件返回Buffer。

const cloud = require('wx-server-sdk')

const request = require('request')

const fs = require('fs')

const path = require('path')

cloud.init({

  env: cloud.DYNAMIC_CURRENT_ENV

})

const db = cloud.database(); //初始化云数据库

exports.main = async (event, context) => {

  var url = event.url; //下载地址,应该由前端进行传递,而后云函数进行下载

  var type = event.type; //type:'dump'(转储) 'trans'(传递)

  var filename = event.filename;

  //文件名称需要自己进行上传,或者substring 截取url

  var options = {

    url: url,

    encoding: null,

    headers: {

      "content-type": "application/octet-stream",

    },

  };

  return new Promise(function (resolve, reject) {

    request(options, function (error, response, body) {

      if(type=='trans'){

          //中继

        resolve(body)

      }else{

          //转储

        resolve(

          cloud.uploadFile({

            cloudPath: 'tmp/'+filename,

            fileContent: body,

          })

        )

      }

    })

  })

}

5.中继下载方式(不推荐,适合小文件)

如果文件达到一定体积,会出现如下问题:

中继下载方式对文件的大小有限制,这是由于云函数返回限制决定的,很容易超出。但是对于一些几kb的文件,推荐使用这种方式,减少了转储所需要耗费的时间。

中继方式下载资源写法如下:

   var _filename = '美景.jpg';

   var _url = 'http://img.apisev.cn:8081/wechat/sk1.jpg';

    wx.cloud.callFunction({

      name:'transfile',

      data:{

        url:_url,

        filename:_filename,

        type:'trans'

      },

      success(res){

        console.log(res)

        const FileSystemManager = wx.getFileSystemManager();

        FileSystemManager.writeFile({

          filePath:wx.env.USER_DATA_PATH+"/"+_filename,

          data:res.result,

          encoding: 'binary',//编码方式,二进制

          success(tres){

            console.log(tres)

            //可以根据filePath 打开文件,此处以为图片举例

            var _filepath = wx.env.USER_DATA_PATH+"/"+_filename;

            wx.previewImage({

              urls: [_filepath],

            })

          },fail(tres){

            console.log(tres)

          }

        })

      },fail(res){

        console.log(res)

      }

    })

真机运行,可以成功预览资源图片。

6.转储下载方式(推荐)

首先在互联网资源随便找了一个图片资源地址,调用云函数。

var _filename = '美景.jpg';

var _url = 'https://n.sinaimg.cn/sinacn20106/212/w2048h1364/20190828/cded-icuacsa3953451.jpg';

wx.cloud.callFunction({

      name:'transfile',

      data:{

        url:_url,

        filename:_filename,

        type:'dump'

      },

      success(res){

        console.log(res)

      },fail(res){

        console.log(res)

      }

 })

返回内容如下:

图片成功被转存到云存储空间。

7.参考文档

[1] FileSystemManager.writeFile(Object object)

微信小程序开发 -- 通过云函数下载任意文件的更多相关文章

  1. 微信小程序开发技巧总结(二) -- 文件的选取、移动、上传和下载

    微信小程序开发技巧总结(二) -- 文件的选取.移动.上传和下载 1.不同类型文件的选取 1.1 常用的图片 视频 对于大部分开发者来说,需要上传的文件形式主要为图片,微信为此提供了接口. wx.ch ...

  2. 微信小程序开发——使用回调函数出现异常:TypeError: Cannot read property 'setData' of undefined

    关键技术点: 作用域问题——回调函数中的作用域已经脱离了调用函数了,因此需要在回调函数外边把this赋给一个新的变量才可以了. 业务需求: 微信小程序开发,业务逻辑需要,需要把获取手机号码的业务逻辑作 ...

  3. 微信小程序如何创建云函数并安装wx-server-sdk依赖

    时间:2020/01/23 步骤 1.在微信开发者工具中云函数所在的文件夹的图标与其他文件夹是不同的,如下(第一个是云函数): 如果需要使一个普通文件变为云函数文件夹,需要在project.confi ...

  4. 微信小程序开发之云开发

    创建云开发小程序项目 开通云开发 开通后界面 选择开发环境 开启使用npm模块 安装wx-server-sdk npm install --save wx-server-sdk@latest 创建云函 ...

  5. 微信小程序开发实战(云开发)--资产管理工具

    添加首页 menu页面 截图展示 menu.js源码 // pages/menu/menu.js Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听 ...

  6. 微信小程序开发平台新功能「云开发」快速上手体验

    微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...

  7. 微信小程序开发(二)----- 云开发

    1.概念 微信小程序的云开发是腾讯云与微信团队深度合作推出的一个全新的小程序的解决方案,它提供了云函数.云数据库与云存储这三大基础能力支持,随着云开发的出现,小程序的开发者可以将服务端的部署和运营的环 ...

  8. 微信小程序开发《一》:阿里云tomcat免费配置https

    小狼咕咕最近开启了微信小程序开发的征程,由于微信小程序的前后台通信必须通过https协议,所以小狼咕咕第一件要做的事就是配置一个能够通过https访问的后台服务.小狼咕咕用的是阿里云ECS服务器,Li ...

  9. $微信小程序开发实践点滴——接入Bmob后端云

    Bmob后端云官网:http://www.bmob.cn/ 微信公众平台官网:https://mp.weixin.qq.com/ 微信小程序官方开发文档:https://mp.weixin.qq.co ...

随机推荐

  1. java的基础知识01

    来自<head first java>书籍的摘录

  2. CSDN排名及积分规则

    博客排行榜排名分值=个人Blog全部随笔与文章的阅读数之和+个人Blog全部评论数之和*10+个人所发表的评论数之和*50 CSDN博客积分计算规则: 1.每公布一篇原创或者翻译文章:可获得10分. ...

  3. swupdate 之 readback handler

    背景 使用 swupdate 作为 OTA 方案 ,有项目要求在写入数据到分区之后需要再次读出校验. 初步实现:readout-verify attribute 初步分析有两种方式 方案一 在每一笔数 ...

  4. CSS 块元素、内联元素、内联块元素三者的区别与转换

    三种元素 块元素 内联元素 内联块元素 元素之间的转换 三种元素 元素就是标签,布局中常用的有三种标签,块元素.内联元素.内联块元素. 了解这三种元素的特性,才能熟练的进行页面布局. 块元素 块元素, ...

  5. Excel 函数 常见错误

    excel公式出错的值. 常见错误值类型: #N/A #VALUE! #NAME? #REF! #NUM! #NULL! #N/A 找不到指定内容,比如查找根本不存在的内容,便显示该错误值 比如在使用 ...

  6. (一)Redis介绍

    1 背景 在早期的互联网Web 1.0时代,大部分企业还是采用传统的企业级单体应用架构,而一时间蜂拥而至的巨大用户流量使得这种架构难以支撑,通过对诸多系统架构实施以及对巨大用户流量的分析过程中发现,其 ...

  7. 【Hadoop离线基础总结】oozie的安装部署与使用

    目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...

  8. 可怕!CPU竟成了黑客的帮凶!

    本故事根据CPU真实漏洞改编 前情回顾 还记得我吗,我是阿Q,就是那个CPU一号车间的阿Q啊.如果你忘记了我,记得看看这里回忆一下哦:完了!CPU一味求快出事儿了! 自从我们车间用上了乱序执行和分支预 ...

  9. Android ListView 代码1

    目录 ListView效果 一.ListView的简单用法 二.定制ListView的界面 目标 步骤 1.定义一个实体类作为ListView适配器的适配对象. 2.为ListView的子项指定我们的 ...

  10. JVM入门--类加载器

    一.基础架构 概览 我们平时说的栈是指的Java栈,native method stack 里面装的都是native方法 细节架构图 二.类加载器 1.类的加载 方法区并不是存放方法的区域,其是存放类 ...