1.雲開發介紹javascript
微信小程序開發者衆所周知,小程序開發擁有許多限制,當我仍是一個菜鳥入門的時候,第一關就卡在了沒有備案域名的HTTP請求上面,那時候雲開發上線也沒多久,使用的人也不是不少,我抱着嘗試的態度去接觸了雲開發,發現了雲開發的妙處。(自由)html
blog:微信小程序HTTP訪問連接解決方案前端
2.小程序文件下載限制java
微信小程序除了對訪問地址有限制以外,對於文件下載,也存在的限制,以下圖所示,只有資源服務器A,在downloadFile域名白名單內且配置了SSL訪問,即HTTPS才能夠正常的下載資源。(閒的蛋疼,飽受詬病)數據庫
3.雲函數下載任意文件設計小程序
依然秉持着對雲開發的信任,嘗試使用雲函數進行任意文件下載,設計思路以下圖所示。微信小程序
上圖描述的兩種經過雲函數下載文件的方式api
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)
8.做者QQ(開發需求)
QQ: 1025584691