小程序web-view嵌套H5如何实现图片下载或json数据传输

本文介绍了一种在微信小程序WebView中实现图片保存至手机相册的功能。通过两种方式传递base64编码的图片数据:一是利用navigateBack结合postMessage;二是通过navigateTo跳转并携带参数。文中详细解释了具体步骤及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近公司小程序做了一个功能,web-view嵌套的html页面文件小程序是不支持下载的,问题来了,如何实现这个功能呢?

第一步:在html页面引入这个通讯js

<script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>

第二步:html页面

<button class="img-save" onclick="saveImg()" style="border: none;">保存</button>

第三步:触发点击事件之后,其实有多种方式传输

--------------------------------------------------------------------------------第一种方式,保存文件要返回上个页面才能执行,不推荐------------------------------------------------------------------------

1.第一种方式页面返回时触发返回我们想要的数据,这里的图片我是以base64的流传输,data中就是你要传的数据了,wx.miniProgram.navigateBack({ delta: 1 }),页面返回上一页才会触发推送数据

function saveImg(){
		var imgData=$("#save").attr("href");
		var configLike=$("#configLike").val();
		if(imgData!=''&&imgData!=null){
			wx.miniProgram.postMessage({
					data: {
							imgData: imgData, // 刚才拿到的base64 数据
							configLike:configLike //点赞数量,传到小程序,非VIP只能设置100
					}
			})
			wx.miniProgram.navigateBack({ delta: 1 }) //注意这里.
							
		}else{
			alert("服务正忙");
		}
						
}

在小程序中怎么处理获取的数据呢,我这里的小程序使用的是uniapp写的,微信api的方法不一样,@message代表页面返回触发,接受到数据,可以去看官方的讲解。上面一步推送过来这里设置了会自动接受到消息的

 <web-view :src="webViewUrl" @message="getMessage"></web-view>
        getMessage(e){
				console.log(e);
				console.log("------------");
			    let img =  e.detail.data[0].imgData;
				var configLikeCount=e.detail.data[0].configLike;//点赞数量
				 this.saveImg(img);
			},
			

-------------------------------------------------------第二种,推荐-------------------------------------------------------------

1.html代码,跳转页面时会在小程序onload加载获取到参数

                function saveImg(){
						var imgData=$("#save").attr("href");
						var configLike=$("#configLike").val();
						wx.miniProgram.navigateTo({url:'/pages/interesting/interst-sucess/interst-sucess?imgData='+imgData+"&configLike="+configLike})
						
					}

2.小程序页面

onLoad(e) {
			if(e){
//接收上面的参数
				this.imgData=e.imgData;
//保存图片,保存方法和上门的一直
				this.saveImg();
			}
		},

-----最后,保存图片的方法,保存都手机相册中

        saveImg(){
				var _this=this;
				var img=this.imgData;
				uni.showLoading({title:'正在下载中...'});
				wx.getFileSystemManager().writeFile({
				  filePath: wx.env.USER_DATA_PATH + '/qrcode.png',  //这里先把文件写到临时目录里. 
				  data: img.slice(22), //注意这里
				  encoding: 'base64',
				  success: res => {
				    console.log('success')
				    wx.saveImageToPhotosAlbum({
				      filePath: wx.env.USER_DATA_PATH + '/qrcode.png', //这是把临时文件 保存到 相册, 收工
				      success: res => {
						  uni.hideLoading();
						  setTimeout(function() {
						 	uni.showToast({
						 		title: '下载成功,请到相册查看',
						 		duration: 2000,
						 		icon: 'none'
						 	});
						 }, 1000)  //延迟时间
				      },
				      fail: error => { 
						  console.log(error)
					      wx.showToast({ title: '服务正忙' })
					   }
				    })
				  },
				  fail: error => { 
					  console.log(error)
					  wx.showToast({ title: '服务正忙' })
				   }
				})
			}

 

### uni-app 小程序嵌套 H5 页面数据传递方法 #### 实现原理 在uni-app的小程序环境中,通过`<web-view>`组件可以加载外部H5页面。为了实现小程序H5数据传输,可以通过URL参数的方式,在加载H5页面时将所需数据作为查询字符串附加到目标网址后面。 #### 代码示例 ##### 小程序端配置 当需要向H5页面传递数据时,可以在设置`src`属性的同时构建带有参数的完整路径: ```html <!--小程序中定义web-view --> <template> <view> <!-- 使用v-bind动态绑定url地址,并附带要发送给H5的数据 --> <web-view :src="'https://example.com/h5page?data=' + encodeURIComponent(JSON.stringify(data))"></web-view> </view> </template> <script> export default { data() { return { // 需要传递至H5的数据对象 data: { key1: 'value1', key2: 'value2' } }; }, }; </script> ``` 上述代码展示了如何利用JavaScript中的`JSON.stringify()`函数序列化复杂类型(如对象),并通过`encodeURIComponent()`编码确保特殊字符不会破坏URL结构[^1]。 ##### 接收方(H5)解析逻辑 对于接收到的请求,H5页面则需读取并解析这些参数: ```javascript // 获取当前页面URL上的query string部分 const queryString = window.location.search; // 解析queryString得到键值对形式的对象 function getQueryParams(qs){ qs = qs.split("+").join(" "); var params={}, tokens, re=/\[(.*?)\]/g, // 匹配[]内的内容用于处理数组型参数 m; tokens=qs.substring(1).split("&"); for(var i=0;i<tokens.length;i++){ var p=tokens[i].split('='); if (m=re.exec(p[0])){ var targetKey=m[1]; if(!params[p[0]]){ params[p[0]]=[]; } params[p[0]][targetKey]=decodeURIComponent((p[1]+''==='true'||p[1]+''==='false')?(p[1]==='true'?true:false):p[1]); }else{ if (!/[^\w\-\.]/.test(p[0])){ params[p[0]]=decodeURIComponent(p[1]); } } } try { // 如果是json格式,则尝试反序列化成js对象 const jsonDataStr=params['data']; delete params['data']; // 移除原始未解码版本 Object.assign(params, JSON.parse(decodeURIComponent(jsonDataStr))); } catch(e){} return params; } console.log('Received Data:', getQueryParams(queryString)); ``` 此段脚本负责提取并转换来自小程序的输入信息,使其能够被H5应用正常理解和使用[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hexu_blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值