在小程序上用七牛存儲

TLDR

// 選到圖片
wx.chooseImage({
    count: 1,
    success: function(res) {
        var filePath = res.tempFilePaths[0];
        //上傳
        wx.uploadFile({
            url: 'https://up.qbox.me',//如果是華北一請用up-z1.qbox.me
            filePath: filePath,
            name: 'file',
            formData: {
                'key': filePath.split('//')[1],
                'token': uptoken
            },
            success: function(res) {
                var data = JSON.parse(res.data);

                self.setData({
                    imageUrl: `https: //xxx.qnssl.com/${data.key}`
                })
                //do something
            },
            fail(error) {
                console.log(error)
            },
            complete(res) {
                console.log(res)
            }
        });
    }
})

最近公司前端拋開了操作DOM的jQuery轉頭用Vue,對于一個曾經寫了不少客戶端代碼的我來說,真的滿心歡喜。很喜歡他一切UI都是由數據控制的思路。

但是七牛的JS SDK體積龐大,而且做的事情太多,雖然在傳統的web上用起來還算順手。但是一旦引入一些其他框架就顯得有點格格不入了。在和Vue如出一轍的微信小程序中更是如此。

那問題來了,小程序木有七牛的SDK啊,他的js sdk操作dom小程序也沒法用。但我還想用七牛。

怎么辦?


七牛sdk最終做的也就是上傳文件,那我們知道他最終上傳的格式就可以隨心所欲了。

看一下七牛官方文檔: 里面有很詳細的描寫:

上傳圖片要用HTTP POST一個 表單upload.qiniu.com,而且必須的字段有兩個:

字段 類型 描述
token string 上傳憑證
file file 文件

token從自己服務器拿到,詳情看這里

file就是你要上傳的文件咯。

基于這樣的思路,感覺豁然開朗呀。

這時候我們來看一眼微信小程序的文檔

用脊柱就能寫出來如下的代碼:

wx.uploadFile({
  url: 'https://upload.qiniu.com',
  filePath: filePath,
  name: 'file',
  formData: {
    'key': filePath.split('//')[1],
    'token': uptoken
  },
  success: function(res) {
    var data = JSON.parse(res.data);
    //do something
  },
  fail(error) {
    console.log(error)
  }
});

開心的Run一下,你會得到一個

uploadFile:fail Error: Hostname/IP doesn't match certificate's altnames: "Host: up-z1.qiniu.com. is not in the cert's altnames: DNS:*.qbox.me, DNS:qbox.me"

qbox是啥?在網上搜查一番,發現qbox.me就是七牛。

換了域名以后,搞定~


中間遇到的一些坑:

  • qbox.me是qiniu.com的本體,SSL證書也是前者的
  • qiniu上傳遇到401是uptoken沒搞定
  • qiniu上傳遇到400,估計是域名錯了,或者是表單有問題
  • 如果在七牛后臺選了華北1節點,那么上傳要用up-z1而不是up,不然一樣400
  • 小程序所有的網絡請求要用https,發布的話要在后臺設置白名單,白名單一個月只能修改三次
  • 小程序wx.uploadFile接口中name字段是會拼在formData里作為filePath的key的,而qiniu要求必須用file作為上傳文件的key
var upload = {
  filePath: ChoosenFilePath,
  name: 'file'//qiniu上傳一定要寫`file`,亂改就沒法上傳了
};
wx.uploadFile(upload);
//等價于
var formData = {
  upload.name: upload.filePath
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言: 做小程序有一段時間了,總結一下做過的技術點,特此貢獻給小伙伴們!項目中,有圖片存儲、視頻存儲、錄音存儲這三...
    vobear閱讀 5,097評論 3 8
  • 七牛云js-sdk應用總結 基本思路 首先,整個七牛云sdk的思路是,先去服務器端拿uptoken,前段js來操作...
    jacklin1992閱讀 9,236評論 2 16
  • TL;DR SDK 連接在這https://github.com/gpake/qiniu-wxapp-sdk 正文...
    懶蟲柳橙汁閱讀 4,756評論 0 0
  • 看了前輩分享的何帆讀書法,第一次除了寫讀書筆記之外,進行一個整體的小結和感想。 在讀書之前,我們要...
    YUKI君君閱讀 817評論 2 3
  • 三門峽為何要叫三門峽?這個問題可能難倒了大部分同學。那么就由我來告訴你們吧。這是因為在黃河上面,離三門...
    是這樣的嗎閱讀 12,931評論 2 1