Maison > Article > interface Web > Analyse approfondie de la sauvegarde des images implémentées dans les pages de l'applet WeChat (avec code)
Dans l'article précédent "Une brève analyse de l'interaction entre les mini-programmes WeChat et le Web (partage de code)", je vais vous donner une compréhension de l'interaction entre les mini-programmes WeChat et le Web. L'article suivant vous expliquera comment enregistrer des images sur la page de l'applet WeChat. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
Enregistrez l'image dans la webview
du mini programme. Parce que le js-sdk
de WeChat ne fournit pas la méthode saveImageToPhotosAlbum
webview
里保存图片。因为微信的js-sdk
没有提供saveImageToPhotosAlbum
方法
更多web
和小程序的交互,请看这里
先加载微信js-sdk
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
1、html
端把图片转为base64
,然后通过postmessage
传递给小程序
let img = new Image(); img.src = "xxxx"; //这里是图片的src img.crossOrigin = "anonymous"; //The opeartaion is insecure . 其它跨域的问题 自行代理解决 img.onload = function () { let canvas = document.createElement("canvas"); canvas.width = img.width; canvas.height = img.height; let ctx = canvas.getContext("2d"); ctx.drawImage(this, 0, 0); let imgBase64Data = canvas.toDataURL("image/jpeg", 1); //这里就拿到了base64 wx.miniProgram.postMessage({ data: { imgData: imgBase64Data, // 刚才拿到的base64 数据 }, }); };
2、小程序监听postmessage
拿到图片base64
数据。
// wxml < web - view src = "http://www.chuchur.com/save-image" bindmessage = "getMessage" > < /web-view> // js Page({ data: { imageData: null } getMessage(e) { this.setData({ imageData: e.detail.data[0].imgData }) } })
3. 保存图片到相册(在小程序里)
因为拿到是base64
图片数据,首先要把它存为图片文件。
wx.getFileSystemManager().writeFile({ filePath: wx.env.USER_DATA_PATH + "/qrcode.png", //这里先把文件写到临时目录里. data: this.data.imageData.slice(22), // 注意这里 encoding: "base64", success: (res) => { console.log("success"); }, fail: (error) => { console.log(error); }, });
getFileSystemManager的writeFile写入的base64是不包含图片的头字节的。所以要干掉data:image/jpeg;base64,等字符
有了文件路径就可以保存到相册了
wx.saveImageToPhotosAlbum({ filePath: wx.env.USER_DATA_PATH + "/qrcode.png", //这是把临时文件 保存到 相册, 收工 success: (res) => { wx.showToast({ title: "保存成功!", }); }, fail: (error) => { console.log(error); }, });
文档发现虽然h5
中的postMessage
会马上提交信息,但是小程序并不会马上受理,在小程序webview
上的监听函数,只会在特定时机触发并收到消息:也就是postMessage
所有的消息都只能等得分享或webview
的生命周期结束才会被触发。他是一个消息队列:
getMessage: function(e) { if (e.type === 'message' && e.detail && e.detail.data && e.detail.data.length > 0) { e.detail.data.forEach(function(dataItem) { if (dataItem.type === 'qbreport' && dataItem.key) { // todo: yourFn(dataItem.key) } }) } }
所以,我们在执行保存的时候可以立马触发它的返回事件。
function() { // 此处省略 wx.miniProgram.postMessage({ data: { xxx: 'aaa' } }) wx.miniProgram.navigateBack({ delta: 1 }) //注意这里. }
html
web
et les mini-programmes, veuillez voir ici
Chargez d'abord WeChat js-sdk
En trois étapeswebchat webview save image <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <script> function saveImage() { let img = new Image() img.src = 'xxxx' //这里是图片的src img.crossOrigin = 'anonymous' //The opeartaion is insecure , 其他跨域问题自行代理解决. img.onload = function() { let canvas = document.createElement('canvas') canvas.width = img.width canvas.height = img.height let ctx = canvas.getContext('2d') ctx.drawImage(this, 0, 0) let imgBase64Data = canvas.toDataURL('image/jpeg', 1) //这里就拿到了base64 wx.miniProgram.postMessage({ data: { imgData: imgBase64Data // 刚才拿到的base64 数据 } }) wx.miniProgram.navigateBack({ delta: 1 }) //注意这里. } } </script>
1 Convertissez l'image en base64
sur le html<.>, puis transmettez-le à l'applet via <code>postmessage
// wxml < web - view src = "http://www.chuchur.com/save-image" bindmessage = "getMessage" > < /web-view> // js Page({ getMessage(e) { let img = e.detail.data[0].imgData wx.getFileSystemManager().writeFile({ filePath: wx.env.USER_DATA_PATH + '/qrcode.jpeg', //这里先把文件写到临时目录里. data: img.slice(22), //注意这里 encoding: 'base64', success: res => { console.log('success') wx.saveImageToPhotosAlbum({ filePath: wx.env.USER_DATA_PATH + '/qrcode.jpeg', //这是把临时文件 保存到 相册, 收工 success: res => { wx.showToast({ title: '保存成功!' }) }, fail: error => { console.log(error) } }) }, fail: error => { console.log(error) } }) } })🎜🎜2 L'applet écoute
postmessage
et obtient l'image base64code> données. 🎜🎜<pre class="brush:php;toolbar:false"> wx.showLoading({
title: "正在下载图片... ",
mask: !1
})
wx.downloadFile({
url: &#39;填写一个远程的图片链接&#39;,
success: function(t) {
wx.showLoading({
title: "正在保存图片",
mask: !1
})
wx.saveImageToPhotosAlbum({
filePath: t.tempFilePath,
success: function() {
wx.showModal({
title: "自定义提示信息",
content: "保存成功",
showCancel: !1
});
},
fail: function(t) {
wx.showModal({
title: "图片保存失败",
content: t.errMsg,
showCancel: !1
});
},
complete: function(t) {
wx.hideLoading();
}
});
},
fail: function(t) {
wx.showModal({
title: "图片下载失败",
content: t.errMsg,
showCancel: !1
});
},
complete: function(t) {
wx.hideLoading();
}
}))</pre>🎜🎜3. Enregistrez l'image dans l'album (dans le mini programme) 🎜🎜🎜Parce que vous obtenez les données d'image <code>base64
, vous devez d'abord les enregistrer en tant que fichier image. 🎜rrreee🎜🎜Le base64 écrit par writeFile de getFileSystemManager ne contient pas l'octet d'en-tête de l'image. Nous devons donc nous débarrasser des données :image/jpeg;base64 et autres caractères🎜🎜🎜Avec le chemin du fichier, vous pouvez l'enregistrer dans l'album🎜rrreee🎜Vous ne l'avez pas reçu ? Pas déclenché en temps réel ? 🎜🎜Le document révèle que même si postMessage
dans h5
soumettra les informations immédiatement, le mini-programme ne les acceptera pas immédiatement dans le mini-programme webview La fonction d'écoute ne sera déclenchée et ne recevra des messages qu'à des moments précis : c'est-à-dire que tous les messages dans <code>postMessage
ne pourront être déclenchés qu'après la fin du cycle de vie du partage ou de la webview
. . Il s'agit d'une file d'attente de messages : 🎜rrreee🎜🎜Donc🎜, on peut déclencher son événement de retour immédiatement lors de l'exécution de la sauvegarde. 🎜rrreee🎜Le code complet est le suivant : 🎜🎜Code latéral html
: 🎜rrreee🎜Code latéral du petit programme : 🎜rrreee🎜Autre lié🎜🎜🎜Enregistrer les images à distance🎜🎜rrreee🎜Apprentissage recommandé : 🎜 Tutoriel vidéo SVG🎜🎜🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!