在微信小程序中保存網(wǎng)絡圖片
微信代碼片段點這里, 該功能需要添加appid才能進行正常的測試。
在小程序的文檔中我們得知,wx.saveImageToPhotosAlbum 是用來保存圖片到相冊的。
但是仔細一看會發(fā)現(xiàn)這個接口的filePath參數(shù)只接受臨時文件路徑或永久文件路徑,不支持網(wǎng)絡圖片路徑,意味著我們不能直接調用這個接口。。
因此先需要把該文件下載至本地,使用 wx.downloadFile 。
但值得注意的是小程序只可以跟指定的域名與進行網(wǎng)絡通信,也就是說下載圖片之前,我們需要先去微信公眾者平臺的開發(fā)設置里設置uploadFile合法域名。
示例代碼如下:
<!-- index.wxml --> <image class="qr-code" src="{{url}}" mode="aspectFill" /> <button class="text" bindtap="saveImage">保存圖片</button>
// index.js const app = getApp() Page({ data: { url: 'https://avatars3.githubusercontent.com/u/23024075?s=460&v=4' }, // 保存圖片 saveImage() { this.wxToPromise('downloadFile', { url: this.data.url }) .then(res => this.wxToPromise('saveImageToPhotosAlbum', { filePath: res.tempFilePath })) .then(res => { // do something wx.showToast({ title: '保存成功~',icon: 'none' }); }) .catch(err) => { console.log(err); // 如果是用戶自己取消的話保存圖片的話 // if (~err.errMsg.indexOf('cancel')) return; }) }, /** * 將 callback 轉為易讀的 promise * @returns [promise] */ wxToPromise(method, opt) { return new Promise((resolve, reject) => { wx[method]({ ...opt, success(res) { opt.success && opt.success(); resolve(res) }, fail(err) { opt.fail && opt.fail(); reject(err) } }) }); }, })
然后理論上就可以保存圖片了... 用戶第一次在我們的小程序使用保存圖片這個功能是會彈出一個授權彈框,如果用戶手滑點了拒絕授權后再點一次保存圖片,然后就會發(fā)現(xiàn)什么反應都沒有了。。。
出現(xiàn)這樣的原因是因為這個授權彈框只會出現(xiàn)一次,所以我們得想辦法再讓用戶重新授權一次。這時就想到使用 wx.authorize .
但是經(jīng)過測試后發(fā)現(xiàn),使用 wx.authorize 后,會報 authorize:fail auth deny 的錯誤。然后經(jīng)過查閱資料得知:
- 如果用戶未接受或拒絕過此權限,會彈窗詢問用戶,用戶點擊同意后方可調用接口;
- 如果用戶已授權,可以直接調用接口;
- 如果用戶已拒絕授權,則不會出現(xiàn)彈窗,而是直接進入接口 fail 回調。請開發(fā)者兼容用戶拒絕授權的場景。
emmm... 那這樣效果當然不符合我們預期,只能在換一種方式。這時就想到了使用<button open-type="openSetting"/>,在交互上做一個提示彈框,引導用戶重新授權:
<image class="qr-code" src="{{url}}" mode="aspectFill" /> <button class="text" bindtap="saveImage">保存圖片</button> <!-- 簡陋版提示 --> <view wx:if="{{showDialog}}" class="dialog-wrap"> <view class="dialog"> 這是一段提示用戶授權的提示語 <view class="dialog-footer"> <button class="btn" open-type="openSetting" bindtap="confirm" > 授權 </button> <button class="btn" bindtap="cancel">取消</button> </view> </view> </view>
const app = getApp() Page({ data: { url: 'https://avatars3.githubusercontent.com/u/23024075?s=460&v=4', showDialog: false, }, saveImage() { this.wxToPromise('downloadFile', { url: this.data.url }) .then(res => this.wxToPromise('saveImageToPhotosAlbum', { filePath: res.tempFilePath })) .then(res => { console.log(res); // this.hide(); wx.showToast({ title: '保存成功~', icon: 'none', }); }) .catch(({ errMsg }) => { console.log(errMsg) // if (~errMsg.indexOf('cancel')) return; if (!~errMsg.indexOf('auth')) { wx.showToast({ title: '圖片保存失敗,稍后再試', icon: 'none' }); } else { // 調用授權提示彈框 this.setData({ showDialog: true }) }; }) }, // callback to promise wxToPromise(method, opt) { return new Promise((resolve, reject) => { wx[method]({ ...opt, success(res) { opt.success && opt.success(); resolve(res) }, fail(err) { opt.fail && opt.fail(); reject(err) } }) }); }, confirm() { this.setData({ showDialog:false }) }, cancel() { this.setData({ showDialog: false }) } })
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
WEB開發(fā)之注冊頁面驗證碼倒計時代碼的實現(xiàn)
近期在搞一個H5+backbone 項目,驗證輸入手機號 驗證碼倒計時功能,代碼中包含了前端樣式布局代碼和后端邏輯實現(xiàn),思路明確,具有參考借鑒價值,需要的朋友參考下吧2016-12-12網(wǎng)頁前端登錄js按Enter回車鍵實現(xiàn)登陸的兩種方法
下面小編就為大家?guī)硪黄W(wǎng)頁前端登錄js按Enter回車鍵實現(xiàn)登陸的兩種方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考2016-05-05js插件YprogressBar實現(xiàn)漂亮的進度條效果
ProgressBar.js 是一個借助動態(tài) SVG 路徑的漂亮的,響應式的進度條效果。使用 ProgressBar.js 可以很容易地創(chuàng)建任意形狀的進度條。這個 JavaScript 庫提供線條,圓形和方形等幾個內(nèi)置的形狀,但你可使用 Illustrator 或任何其它的矢量圖形編輯器創(chuàng)建自己的進度條效果。2015-04-04鼠標事件的screenY,pageY,clientY,layerY,offsetY屬性詳解
這篇文章主要介紹了鼠標事件的screenY,pageY,clientY,layerY,offsetY屬性詳解,需要的朋友可以參考下2015-03-03