微信小程序开发 -- 通过云函数下载任意文件
微信小程序开发 -- 通过云函数下载任意文件
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 ...
随机推荐
- 历史上的今天mysql数据库包含详情分类以及图片
历史上的今天mysql数据库包含详情分类以及图片 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debo71iaJ& ...
- 什么是动态规划?动态规划的意义是什么?https://www.zhihu.com/question/23995189
阮行止 上海洛谷网络科技有限公司 讲师 intro 很有意思的问题.以往见过许多教材,对动态规划(DP)的引入属于"奉天承运,皇帝诏曰"式:不给出一点引入,见面即拿出一大堆公式吓人 ...
- 数学--数论--POJ1365——Prime Land
Description Everybody in the Prime Land is using a prime base number system. In this system, each po ...
- CodeForces - 1245F Daniel and Spring Cleaning (数位DP)
While doing some spring cleaning, Daniel found an old calculator that he loves so much. However, it ...
- IoTClientTool自动升级更新
IoTClientTool是什么 IoTClientTool是什么,IoTClientTool是IoTClient开源组件的可视化操的作实现.方便对plc设备和ModBusRtu.BACnet.串口等 ...
- 低价购买(LIS方案统计)
题意:https://www.luogu.com.cn/problem/P1108 如果两个数列组成的数字完全相同,那我们说这两个数列相同. 求出最长下降子序列的方案数. 题解来自 wjyyy大神. ...
- java23种设计模式——泡MM版
一.创建型模式 1.FACTORY:追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,固然口味有所不同,但不管你带MM往麦当劳或肯德基,只管向服务员说;来四个鸡翅就行了.麦当劳和肯德 ...
- openshift 4.3 Istio的搭建(istio 系列一)
openshift 4.3 Istio的搭建 本文档覆盖了官方文档的Setup的所有章节 目录 openshift 4.3 Istio的搭建 安装Istio openshift安装Istio 更新is ...
- Coursera课程笔记----C程序设计进阶----Week 1&2
C程序中的函数(Week 1&2) 函数 函数的定义 对函数的普遍认识:y=f(x) C语言中的常用函数: 平方根: r = sqrt(100.0) 底数x的y次幂:k = pow(x,y) ...
- 【Hadoop离线基础总结】MapReduce增强(上)
MapReduce增强 MapReduce的分区与reduceTask的数量 概述 MapReduce当中的分区:物以类聚,人以群分.相同key的数据,去往同一个reduce. ReduceTask的 ...