微信小程序開發 -- 經過雲函數下載任意文件

微信小程序開發 -- 經過雲函數下載任意文件

1.雲開發介紹javascript

​ 微信小程序開發者衆所周知,小程序開發擁有許多限制,當我仍是一個菜鳥入門的時候,第一關就卡在了沒有備案域名的HTTP請求上面,那時候雲開發上線也沒多久,使用的人也不是不少,我抱着嘗試的態度去接觸了雲開發,發現了雲開發的妙處。(自由)html

blog:微信小程序HTTP訪問連接解決方案前端

2.小程序文件下載限制java

微信小程序除了對訪問地址有限制以外,對於文件下載,也存在的限制,以下圖所示,只有資源服務器A,在downloadFile域名白名單內且配置了SSL訪問,即HTTPS才能夠正常的下載資源。(閒的蛋疼,飽受詬病)數據庫

3.雲函數下載任意文件設計小程序

依然秉持着對雲開發的信任,嘗試使用雲函數進行任意文件下載,設計思路以下圖所示。微信小程序

上圖描述的兩種經過雲函數下載文件的方式api

  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)

8.做者QQ(開發需求)

QQ: 1025584691

相關文章
相關標籤/搜索