小程序webview和H5页面:间的通讯,页面截图保存到手机相册
- 小程序页面,通过webview 嵌入的H5页面
<template>
<web-view @message="postMessage" :src="url"></web-view>
</template>
<script>
export default {
data() {
return {
imgBase64: "",
url: "http://192.168.111.178:8080/H5Page", // 通过webview 嵌入的H5页面
};
},
methods: {
// 接收H5页返回的信息
postMessage(options) {
this.imgBase64 = options.detail.data[0].imgBase64 || "";
if (this.imgBase64) {
this.toSave();
}
},
// 1.先判断手机相册是否授权;2.授权后再保存到相册
toSave() {
uni.showLoading({
title: "正在生成图片",
mask: true,
});
uni.getSetting({
success: res => {
if (!res.authSetting["scope.writePhotosAlbum"]) {
uni.authorize({
scope: "scope.writePhotosAlbum",
success: () => { // 授权成功
uni.hideLoading();
this.saveImg();
},
fail: res => {
uni.hideLoading();
uni.showToast('无法保存图片,请先授权')
},
});
} else { // 已经授权!
uni.hideLoading();
this.saveImg();
}
},
});
},
saveImg() {
const base64Str = this.imgBase64.slice(22), // 注意这里,截掉 data:image/png;base64,
buffer = uni.base64ToArrayBuffer(base64Str),
filePath = wx.env.USER_DATA_PATH "/base64src.png"; // base64src.png 为保存的图片名称
uni.getFileSystemManager().writeFile({
filePath, // 先把文件写到临时目录里
// 方式一:
data: buffer,
encoding: "binary",
// 方式二:
// data: this.imgBase64.slice(22),
// encoding: "base64",
success: (res) => {
uni.saveImageToPhotosAlbum({
filePath, // 将临时文件 保存到相册
success: res => {
uni.showToast('图片保存成功')
},
fail: error => {
uni.showToast('图片保存失败')
},
});
},
fail: error => {
uni.showToast('图片保存失败')
}
});
}
}
};
</script>
- H5页面
<template>
<div class="wrap" >
<div class="ct" v-show="bgImg">
<img class="ct-close" @click="Close" src="~static/images/cancel.png" />
<div class="ct-content" id="poster" ref="poster" :style="bgImg ? setStyle() : ''">
<div class="ct-txt">{{text}}</div>
</div>
<div class="ct-submit" v-throttle="saveImg">保存图片</div>
</div>
</div>
</template>
<script>
import wx from 'weixin-js-sdk'
import axios from 'axios'
import snapshot from "@/utils/html2Canvas";
export default {
data () {
return {
bgImg: '',
text: ''
}
},
async mounted () {
const bgImg = await this.getImageInfo(
'/api/img/20211008/123456.png'
)
this.bgImg = bgImg.src
},
methods: {
setStyle () {
return `background: url(${this.bgImg}) no-repeat; background-size: 100% 100%; `
},
Close () {
wx.miniProgram.navigateBack({ delta: 1 })
},
getImageInfo (path) {
// 将网络请求图片转换为本地图片,解决因跨域导致画布无法转换为图片问题
return new Promise((resolve, reject) => {
axios
.get(path, { responseType: 'blob' })
.then(res => {
const blob = res.data
const url = URL.createObjectURL(blob)
const img = new Image()
img.src = url
img.onload = () => {
resolve(img)
}
})
.catch(() => {
console.log('加载图片失败')
})
})
},
async saveImg () {
const imgBase64 = await snapshot(this.$refs.poster)
/*
h5中postMessage虽然会立即提交信息,但是小程序并不会立即受理。小程序webview上的监听函数,只会在特定时机触发并接收到消息。
即postMessage所有的消息都只能等得分享或webview的生命周期结束时才会被触发,它是一个消息队列。
在保存图片时,可以立即触发它的返回事件。
*/
wx.miniProgram.postMessage({
data: {
imgBase64 // 要传给小程序的信息
}
})
wx.miniProgram.navigateBack({ delta: 1 }) // 注意:只有执行此事件后,才能在webview的事件监听中接收到信息
}
}
}
</script>
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfafib
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01