小程序图片保存入坑指南

不问归期 提交于 2019-12-01 21:00:28

需求整理

小程序的项目中应用到了保存图片分享到朋友圈的功能,刚开始以为不是很难,后来也是踩了一些坑,这里特此记录下来,以便查阅。

利用base64方法进行图片缓存

小程序文档中关于图片保存应用到了wx.saveImageToPhotosAlbum的api,其中文件的路径不支持网络路径,后台返回的是base64的格式这里我们需要将其转换。参考base64转为图片保存

相关代码如下:

      /*
         无关代码略
       */
	 	var path  = wx.env.USER_DATA_PATH; //定义图片临时路径为微信全局路径
		 var fileManager = wx.getFileSystemManager();//文件系统api
		 let startIdx = this.Img.indexOf('base64,') + 7;
		 let timestamp = new Date().getTime();
		 fileManager.writeFile({
            filePath: `${wx.env.USER_DATA_PATH}/test/${timestamp}.png`,
            data: this.qrcode.slice(startIdx),
            encoding: 'base64',
            success: res => {
               console.log("图片写入成功");
               wx.saveImageToPhotosAlbum({
                  filePath:`${wx.env.USER_DATA_PATH}/test/${timestamp}.png`,
                  success:res=>{
                   console.log("成功保存图片");
                  }
               })
           },
           fail:err=>{
           }

这里保存图片当base64字符串过大的时候微信后台会包尺寸过大的问题,解决的办法可以使用浏览器内置了编码解码的函数:window.btoa() 和 window.atob(,将较大的字符串转为普通串写入。

网络图片下载方式保存图片

当后台返回给我们的是图片的地址的时候,可以将图片下载为临时文件路径保存。
html部分:

<div>
	<image src="{{saveImg}}" />
	<button @tap="createBill">生成海报</button>
</div>

js部分

   /* 
    request为ajax请求的封装可以忽略
   */
  	createBill() {
  	     /* 
             生成海报要判断是否有权限操作,没有则需要打开授权相册功能。
            */
			var that = this;
			if (!this.saveImg) {
				wepy.showToast({
					title: "请等待海报生成",
					image: '../img/fail.png',
					duration: 2000
				})
			}
			wx.getSetting({
				success: function(res) {
					console.log("auth");
					console.log(res);
					if (!res.authSetting["scope.writePhotosAlbum"]) {
						wx.openSetting({
							success(settingdata) {
								console.log(settingdata)
								if (settingdata.authSetting["scope.writePhotosAlbum"]) {
									console.log("获取权限成功,再次点击图片保存到相册")
								} else {
									console.log("获取权限失败")
								}
							}
						})
					}
				}
			})
			wx.saveImageToPhotosAlbum({
				filePath: this.saveImg,
				success: function(res) {
					wepy.showToast({
						title: "海报保存成功",
						icon: 'success',
						duration: 2000
					})
				},
				fail(res) {
					wx.openSetting({
						success(settingdata) {
							console.log(settingdata)
							if (settingdata.authSetting["scope.writePhotosAlbum"]) {
								console.log("获取权限成功,再次点击图片保存到相册")
							} else {
								console.log("获取权限失败")
							}
						}
					})
					if (res.errMsg === "saveImageToPhotosAlbum:fail auth deny") {

					}
				}
			})
   },
   created:()
   {
      request({
			url:"您的url",
				method: 'POST',
			data:{
			 test:'test'
			}
		}).then( res=>{
		   this.img = res;
		   	wx.downloadFile({
		   	success:tempImg=>{
		   	  this.saveImg = tempImg.tempFilePath
		   	},
		   	fail:err =>{
		   	}
		   	});
		})
   }
 

写在最后的话

 基于小程序开发一些功能虽然受制于人,但是我们可以通过其提供的api根据需求相应解决。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!