微信小程序开发 -- 通过云函数下载任意文件
微信小程序开发 -- 通过云函数下载任意文件
1.云开发介绍
微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开发上线也没多久,使用的人也不是很多,我抱着尝试的态度去接触了云开发,发现了云开发的妙处。(自由)
blog:微信小程序HTTP访问链接解决方案
2.小程序文件下载限制
微信小程序除了对访问地址有限制之外,对于文件下载,也存在的限制,如下图所示,只有资源服务器A,在downloadFile域名白名单内且配置了SSL访问,即HTTPS才可以正常的下载资源。(闲的蛋疼,饱受诟病)
.png)
3.云函数下载任意文件设计
依然秉持着对云开发的信任,尝试使用云函数进行任意文件下载,设计思路如下图所示。
.png)
上图描述的两种通过云函数下载文件的方式
- 云函数只作为一个数据中转节点,请求资源转化为Buffer直接返回给小程序端。
- 云函数作为存储器,下载资源存储到云空间,并返回给小程序端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 常用的图片 视频 对于大部分开发者来说,需要上传的文件形式主要为图片,微信为此提供了接口. wx.ch ...
- 微信小程序开发——使用回调函数出现异常:TypeError: Cannot read property 'setData' of undefined
关键技术点: 作用域问题——回调函数中的作用域已经脱离了调用函数了,因此需要在回调函数外边把this赋给一个新的变量才可以了. 业务需求: 微信小程序开发,业务逻辑需要,需要把获取手机号码的业务逻辑作 ...
- 微信小程序如何创建云函数并安装wx-server-sdk依赖
时间:2020/01/23 步骤 1.在微信开发者工具中云函数所在的文件夹的图标与其他文件夹是不同的,如下(第一个是云函数): 如果需要使一个普通文件变为云函数文件夹,需要在project.confi ...
- 微信小程序开发之云开发
创建云开发小程序项目 开通云开发 开通后界面 选择开发环境 开启使用npm模块 安装wx-server-sdk npm install --save wx-server-sdk@latest 创建云函 ...
- 微信小程序开发实战(云开发)--资产管理工具
添加首页 menu页面 截图展示 menu.js源码 // pages/menu/menu.js Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听 ...
- 微信小程序开发平台新功能「云开发」快速上手体验
微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...
- 微信小程序开发(二)----- 云开发
1.概念 微信小程序的云开发是腾讯云与微信团队深度合作推出的一个全新的小程序的解决方案,它提供了云函数.云数据库与云存储这三大基础能力支持,随着云开发的出现,小程序的开发者可以将服务端的部署和运营的环 ...
- 微信小程序开发《一》:阿里云tomcat免费配置https
小狼咕咕最近开启了微信小程序开发的征程,由于微信小程序的前后台通信必须通过https协议,所以小狼咕咕第一件要做的事就是配置一个能够通过https访问的后台服务.小狼咕咕用的是阿里云ECS服务器,Li ...
- $微信小程序开发实践点滴——接入Bmob后端云
Bmob后端云官网:http://www.bmob.cn/ 微信公众平台官网:https://mp.weixin.qq.com/ 微信小程序官方开发文档:https://mp.weixin.qq.co ...
随机推荐
- IDEA 打可执行jar包(maven项目)
1. Ctrl+Shift+Alt+S 打开 Project Structure 2.选择要执行的文件, 依次选择 项目, 方法所在文件(必须有main方法), 保存 3.如果之前路径下曾经打过 ...
- Spring杂谈 | 你真的了解泛型吗?从java的Type到Spring的ResolvableType
关于泛型的基本知识在本文中不会过多提及,本文主要解决的是如何处理泛型,以及java中Type接口下对泛型的一套处理机制,进而分析Spring中的ResolvableType. 文章目录 Type 简介 ...
- POI问题总结,关于数字级联及多级级联(三级以上)
目录 最近公司业务需要用到excel,并且要导出模板,今天为止所有的功能都已经实现了,在这里对出现的一些问题做一个总结. 效果图: 这是一个五级联动的数据,其中第一列是数字开头,实现了五级联动 问题1 ...
- 随笔 - B树算法实现
写代码之前,再回顾一下B树是什么,满足什么样的规则 B树规则: 排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则 子节点数:非叶节点的子节点数>1,且<=M ,且M>=2 ...
- Linux文件操作命令并举例说明其作用
ls ,常用于查看当前文件下有工作中需要的文件 cd, 常用于进行切换文件的位置 vim,常用于编辑软件系统相关的配置文件 ps –ef|grep jdk,常用语显示跟jdk有关的进程 |:表示 ...
- CF-234 F. Fence DP
F. Fence 这个刷Fence的问题看到好几个了... 题意 有一个栅栏,由n块宽为1cm的木板组成,第i块木板高为hi,要给他们刷上油漆,有一桶红色的可以刷a平方厘米的油漆,一桶绿色的可以刷b平 ...
- MOS管、PCB、H桥、步进电机驱动电路、51单片机的IO口驱动能力、灌电流、拉电流、上拉电阻的选择
嵌入式开发PCB设计几点体会(转载):http://bbs.ednchina.com/BLOG_ARTICLE_3021801.HTMCollector-Emitter Saturation Volt ...
- Jmeter-函数助手之${__RandomString(,,)}使用
${__RandomString(,,)}使用方法 1.在日常写脚本中,可以随机生成指定的几个字符串作为入参的value,那么jmeter 的这个工具就特别好用. 应用: 2.填写接口入参, 3.运 ...
- Mysql 常用函数(12)- left 函数
Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html left 的作用 返回字符串 str 中最左边的 ...
- iOS事件的响应和传递机制
跟二狗子哥哥交流的时候,他总说我,说的过程太业余.故 好好学习整理一下.努力不那么业余. 一.事件的产生.传递.响应: 1.事件从父控件依次传递到子控件,寻找最合适的子控件View. 2.寻找最合适的 ...