230320a303 1 year ago
parent
commit
f51690a9ea

BIN
src/assets/img/images/icon_g_share6s.png


+ 273 - 31
src/pagesRoom/dtl.jsx

@@ -47,7 +47,8 @@ class Index extends Component {
       curId,
       curObj: {},
       curImgIndex: 0,
-      curShareCardImg: require('./img/dtl/bg_room_dtl.png')
+      // curShareCardImg: require('./img/dtl/bg_room_dtl.png')
+      curShareCardImg: ''
     }
   }
 
@@ -67,7 +68,6 @@ class Index extends Component {
       Taro.removeStorageSync('APP_cur_sale')
       Taro.setStorageSync("APP_MY_REFERRER", referrer)
     }
-    // this.popupOpen()
   }
   
   getDtl = () => {
@@ -76,7 +76,6 @@ class Index extends Component {
       Taro.setNavigationBarTitle({
         title: res.title || '房源详情'
       })
-      // this.drawAndShareImage(res.mini_coder)
       this.setState({
         curObj: res || {}
       }, () =>{
@@ -474,7 +473,6 @@ class Index extends Component {
     )
   }
 
-
   renderPopup () {
     const { isPopupShow, curShareCardImg  } = this.state
     return (
@@ -482,10 +480,12 @@ class Index extends Component {
         isOpened={isPopupShow}
         onClose={this.popupClose.bind(this)}
       >
-        <Image
-          className="scoped-share-card-img"
-          src={curShareCardImg}
-        />
+        <View className="scoped-share-card-img">
+          <Image
+            className="img"
+            src={curShareCardImg}
+          />
+        </View>
       </AtCurtain>
     )
   }
@@ -501,42 +501,283 @@ class Index extends Component {
   }
 
 
-  drawAndShareImage (qrcodeSrc) {
+  dealCanvasImg (qrcodeSrc) {
     const { curObj } = this.state
     const that = this
-    const canvas = Taro.createOffscreenCanvas({type: '2d', width: 600, height: 1067})
-    const ctx = canvas.getContext('2d')
-    ctx.rect(0 , 0 , canvas.width , canvas.height)
+    const imageArr = curObj.images.split(',')
+    const processMultipleImages = (url) => {
+      return new Promise((resolve, reject) => {
+        Taro.getImageInfo({
+          src: url,
+          success: (res) => {
+            resolve(res)
+          },
+          fail: () => {
+            Taro.showToast({
+              title: '下载失败!'
+            })
+          }
+        })
+      })
+    }
+    Promise.all(
+      imageArr.map(img => processMultipleImages(img+'_adm0'))
+    ).then(img => {
+      let tempImgArr = img.map(i => i.path)
+      that.dealCanvas(tempImgArr)
+    })
+    
+  }
+
+
+
+
+  // drawAndShareImage () {
+  //   const { curObj } = this.state
+  //   const imageArr = curObj.images.split(',')
+  //   if (imageArr.length < 2) {
+  //     Taro.$msgConfirm('房源图片不足~')
+  //     return
+  //   }
+  //   console.log(curObj)
+  //   const that = this
+  //   const cvs = Taro.createOffscreenCanvas({type: '2d', width: 700, height: 990})
+  //   const ctx = cvs.getContext('2d')
+  //   ctx.clearRect(0, 0, cvs.width, cvs.height)
+  //   ctx.rect(0 , 0 , cvs.width , cvs.height)
+  //   ctx.fillStyle = "#fff"
+  //   ctx.fill()
+
+    
+  //   let imgBg = cvs.createImage();
+  //   imgBg.src = require('./img/dtl/bg_room_dtl.jpg')
+  //   imgBg.onload = () => {
+  //     ctx.drawImage(imgBg, 0, 0, 700, 990)
+  //   }
+
+  //   let img1 = cvs.createImage();
+  //   img1.src = curObj.pri_image + '_adm0'
+  //   imgBg.onload = () => {
+  //     ctx.drawImage(img1, 83, 358, 256, 200)
+  //   }
+    
+
+  //   let img2 = cvs.createImage();
+  //   img2.src = curObj.house_img
+  //   imgBg.onload = () => {
+  //     ctx.drawImage(img2, 362, 358, 256, 200)
+  //   }
+    
+
+  //   let img3 = cvs.createImage();
+  //   img3.src = imageArr[0] + '_adm0'
+  //   imgBg.onload = () => {
+  //     ctx.drawImage(img3, 83, 570, 256, 200)
+  //   }
+    
+
+  //   let img4 = cvs.createImage();
+  //   img4.src = imageArr[1] + '_adm0'
+  //   imgBg.onload = () => {
+  //     ctx.drawImage(img4, 362, 570, 256, 200)
+  //   }
+    
+
+    
+  //   that.drawText(ctx, '#333', curObj.title.length > 25 ? curObj.title.substring(0, 25) + '...' : curObj.title, 98, 846, '18px')
+  //   if (curObj.estate_name.length > 7) {
+  //     that.drawText(ctx, '#333', curObj.estate_name, 80, 220, 'normal bold 36px')
+  //   } else {
+  //     that.drawText(ctx, '#333', curObj.estate_name, 80, 220, 'normal bold 56px')
+  //   }
+
+
+  //   that.drawText(ctx, '#333', curObj.area + '㎡', 140, 310, 'normal bold 28px')
+  //   that.drawText(ctx, '#df6135', curObj.floor_price + '万', 280, 310, 'normal bold 32px')
+    
+
+  //   // let base64 = ctx.canvas.toDataURL("image/png")
+  //   // that.setState({
+  //   //   curShareCardImg: base64
+  //   // })
+
+  //   // that.popupOpen()
+    
+    
+  //   const imgData = cvs.toDataURL();
+  //   console.log('imgData')
+  //   console.log(imgData)
+  //   const time = new Date().getTime();
+  //   const fs = wx.getFileSystemManager();
+  //   const filePath = Taro.env.USER_DATA_PATH + "/poster" + time + "share" + ".png";
+  //   fs.writeFile({
+  //     filePath,
+  //     data: imgData.replace(/^data:image\/\w+;base64,/, ""),
+  //     encoding: 'base64',
+  //     success: res => {
+  //       console.log('成功:'+res)
+  //       wx.showShareImageMenu({
+  //         path: filePath,
+  //         success: res => {
+  //           console.log(res, 11);
+  //         }
+  //       })
+  //     },
+  //     fail: err => {
+  //       // 此处可能存在内存满了的情况
+  //       // 需要根据具体需求处理
+  //       console.log(err);
+  //     }
+  //   });
+  //   fs.close()
+
+
+    
+  // }
+
+
+  async drawAndShareImage () {
+    const { curObj, curShareCardImg } = this.state
+    if (curShareCardImg) {
+      wx.showShareImageMenu({
+        path: curShareCardImg,
+        success: res => {
+          console.log(res, 22);
+        }
+      })
+      return
+    }
+    const imageArr = curObj.images.split(',')
+    if (imageArr.length < 2) {
+      Taro.$msgConfirm('房源图片不足~')
+      return
+    }
+    Taro.showLoading({
+      mask: true,
+      title: '图片智能生成中..'
+    })
+    const that = this
+    const cvs = Taro.createOffscreenCanvas({type: '2d', width: 700, height: 990})
+    const ctx = cvs.getContext('2d')
+    ctx.clearRect(0, 0, cvs.width, cvs.height)
+    ctx.rect(0 , 0 , cvs.width , cvs.height)
     ctx.fillStyle = "#fff"
     ctx.fill()
-    const img1 = canvas.createImage()
-    img1.src = require('./img/dtl/bg_room_dtl.png')
-    img1.crossOrigin = 'Anonymous'
-    img1.onload = () => {
-      ctx.drawImage(img1, 0, 0, 600, 1067)
-      const img2 = canvas.createImage()
-      img2.src = qrcodeSrc
-      img2.crossOrigin = 'Anonymous'
-      img2.onload = () => {
-        ctx.drawImage(img2, 320, 950, 100, 100)
-        that.drawText(ctx, 'red', "哈哈哈哈,测试文字", 100, 500)
-        let base64 = ctx.canvas.toDataURL("image/png")
+
+    let imgBg = cvs.createImage();
+    // imgBg.src = require('./img/dtl/bg_room_dtl.jpg')
+    imgBg.src = 'https://img.honglounews.com/20240202095009-3067.jpg_adm0?r='+ Math.random()
+    await new Promise(resolve => {
+      imgBg.onload = resolve;
+    })
+
+    ctx.drawImage(imgBg, 0, 0, 700, 990)
+    let img1 = cvs.createImage();
+    await new Promise(resolve => {
+      img1.onload = resolve;
+      img1.src = curObj.pri_image + '_adm0'
+    })
+    ctx.drawImage(img1, 83, 358, 256, 200)
+
+    let img2 = cvs.createImage();
+    await new Promise(resolve => {
+      img2.onload = resolve;
+      img2.src = curObj.house_img
+    })
+    ctx.drawImage(img2, 362, 358, 256, 200)
+
+    let img3 = cvs.createImage();
+    await new Promise(resolve => {
+      img3.onload = resolve;
+      img3.src = imageArr[0] + '_adm0'
+    })
+    ctx.drawImage(img3, 83, 570, 256, 200)
+
+    let img4 = cvs.createImage();
+    await new Promise(resolve => {
+      img4.onload = resolve;
+      img4.src = imageArr[1] + '_adm0'
+    })
+    ctx.drawImage(img4, 362, 570, 256, 200)
+
+    
+    that.drawText(ctx, '#333', curObj.title.length > 25 ? curObj.title.substring(0, 25) + '...' : curObj.title, 98, 846, '18px')
+    if (curObj.estate_name.length > 7) {
+      that.drawText(ctx, '#333', curObj.estate_name, 80, 220, 'normal bold 36px')
+    } else {
+      that.drawText(ctx, '#333', curObj.estate_name, 80, 220, 'normal bold 56px')
+    }
+
+
+    that.drawText(ctx, '#333', curObj.area + '㎡', 140, 310, 'normal bold 28px')
+    that.drawText(ctx, '#df6135', curObj.price + '万', 280, 310, 'normal bold 32px')
+    
+
+    // let base64 = ctx.canvas.toDataURL("image/png")
+    // that.setState({
+    //   curShareCardImg: base64
+    // })
+
+    // that.popupOpen()
+    
+    setTimeout(() => {
+      imgBg = null
+      img1 = null
+      img2 = null
+      img3 = null
+      img4 = null
+      Taro.hideLoading()
+    }, 6000)
+    
+    const imgData = cvs.toDataURL();
+    const time = new Date().getTime();
+    const fs = wx.getFileSystemManager();
+    const filePath = Taro.env.USER_DATA_PATH + "/poster" + time + "share" + ".png";
+    fs.writeFile({
+      filePath,
+      data: imgData.replace(/^data:image\/\w+;base64,/, ""),
+      encoding: 'base64',
+      success: res => {
         that.setState({
-          curShareCardImg: base64
+          curShareCardImg: filePath
+        })
+        Taro.hideLoading()
+        wx.showShareImageMenu({
+          path: filePath,
+          success: res => {
+            console.log(res, 11);
+          }
         })
+      },
+      fail: err => {
+        // 此处可能存在内存满了的情况
+        // 需要根据具体需求处理
+        console.log(err);
+        Taro.hideLoading()
       }
-    }
+    });
+    fs.close()
+
+
+    
   }
-  drawText = (ctx, color, text, x, y, font = 50) => {
-    ctx.font="50px Arial";
+  drawText = (ctx, color, text, x, y, font) => {
+    ctx.font=`${font} Microsoft YaHei`;
     ctx.fillStyle = color;
     ctx.textAlign = 'left';
     ctx.fillText(text, x, y);
-    // ctx.stroke();
-    // ctx.closePath();
+    ctx.stroke();
+    ctx.closePath();
    }
 
-
+  renderShare () {
+    const iconShare = require('@img/images/icon_g_share6s.png')
+    return (
+      <Button className="g-icon-share btn-to-div" onClick={this.drawAndShareImage.bind(this)}>
+        <Image className="img" src={iconShare} />
+      </Button>
+    )
+  }
 
 
   render () {
@@ -550,6 +791,7 @@ class Index extends Component {
         {(curObj.es_house_list && curObj.es_house_list.length > 0) && this.renderOther()}
         {this.renderSale()}
         {this.renderPopup()}
+        {this.renderShare()}
       </View>
     )
   }

+ 12 - 6
src/pagesRoom/dtl.scss

@@ -25,6 +25,7 @@ page {
     bottom: 20px;
     width: 90px;
     height: 40px;
+    line-height: 40px;
     border-radius: 20px;
     overflow: hidden;
     .bg {
@@ -39,9 +40,11 @@ page {
       position: absolute;
       color: #fff;
       z-index: 2;
-      font-size: 26px;
-      left: 50%;
-      transform: translateX(-50%)
+      font-size: 24px;
+      left: 0;
+      top: 0;
+      text-align: center;
+      width: 100%;
     }
   }
 }
@@ -339,7 +342,10 @@ page {
 }
 
 
-.scoped-share-card-img, canvas {
-  width: 600px;
-  height: 1067px;
+.scoped-share-card-img {
+  text-align: center;
+  .img {
+    width: 500px;
+    height: 708px;
+  }
 }

BIN
src/pagesRoom/img/dtl/bg_room_dtl.jpg


+ 20 - 0
src/pagesRoom/list.jsx

@@ -63,6 +63,26 @@ class Index extends Component {
     if (estate_id) {
       this.getDataList()
     }
+    
+
+    // 把文件删除后再写进,防止超过最大范围而无法写入
+    const fsm = wx.getFileSystemManager();  //文件管理器
+    fsm.readdir({  // 获取文件列表
+      dirPath: Taro.env.USER_DATA_PATH,// 当时写入的文件夹
+      success(res){
+        res.files.forEach((el) => { // 遍历文件列表里的数据
+          // 删除存储的垃圾数据
+          fsm.unlink({
+            filePath: `${Taro.env.USER_DATA_PATH}/${el}`, // 这里注意。文件夹也要加上,如果直接文件名的话会无法找到这个文件
+            fail(e){
+              console.log('readdir文件删除失败:',e)
+            }
+          });
+        })
+      }
+    })
+
+    
   }
 
   componentDidShow () { }

+ 315 - 0
src/pagesRoom/testCanvas/TestCanvas.jsx

@@ -0,0 +1,315 @@
+import Taro, { Component } from '@tarojs/taro'
+import { View, Canvas, Image } from '@tarojs/components'
+import { AtButton } from 'taro-ui'
+import base64src from './base64src'
+// import shareImg from 'https://img.honglounews.com/20240130113109-4475.jpg_adm0'
+import shareImg from '../img/dtl/bg_room_dtl.png'
+
+
+// import './index.scss'
+
+let baseUrlCode = '';
+export default class TestCanvas extends Component {
+
+
+    constructor(props){
+      super(props);
+      this.state = {
+        canvasWidth:560,
+        canvasHeight:978,
+        bgImgPath:'',
+        posterImage:''
+      }
+    }
+
+
+    componentWillMount(){
+      // base64 需要转换
+      let str3 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKQAAACkAQMAAAAjexcCAAAABlBMVEX///8AAABVwtN+AAABc0lEQVRIidWWQZbDMAhDuYHuf0tuwCCBpzNrtGlem8Q/fXUsBDji246qygxkX/vES1pofzNRxZsGKeKgPVmjHifn4dBHuQ5ELyOtFLqr7Cc+qgd9QmvE1YSHKpqf42+MT3TMBiiY+G/BCy15oyIQZMC8w5miNKD0lAn8gYMWBZolTLbAQzuEoO5aQ/tvHHOnfHFQE3DiNYqBUp1cx9GG9avZkRKVRGmK9cmdMvXaGwxnKSnLREOGZq1rIz517pQzMbUVRjx1DJQvPu77zGWgbRAK3zOx4ve1PJTeoCqr1N7dKSdIjYN9LyYLDVSeo/tQW+otlDlYcl9iksZDlXrjviBfze60mHoqmqr5W/vONNT9hViP1tMGypakkKraz08MlAWe1p79z2umd/ocqDi+ZDFQ/n+bj9qzra797lS7Faj7yymzCgPVrk3tTuqM6h6q6smFaGvspFRJ2b39yUD5QJ+3zfRQRrO0H1YVjc8e8Ua/6/gBOpv1YBO8iNcAAAAASUVORK5CYII='
+      base64src(str3, res => {
+        baseUrlCode = res
+      });
+      Taro.getSystemInfo()
+      .then(res => {
+        this.setState({
+          // canvasWidth:res.windowWidth*2,
+          // canvasHeight:res.windowHeight*2
+        })
+      })
+    }
+
+    // 获取微信相册授权信息
+    getSetting(){
+      return new Promise((resolve,reject)=>{
+        Taro.getSetting()
+        .then((res)=>{
+          if (!res.authSetting['scope.writePhotosAlbum']) {
+            Taro.authorize({
+              scope:'scope.writePhotosAlbum',
+            })
+            .then(res=>{
+              if(res.errMsg == 'authorize:ok'){
+                resolve(true)
+              }else{
+                reject(false)
+              }
+            })
+            .catch(()=>{
+              reject(false)
+            })
+          }else{
+            resolve(true)
+          }
+        })
+        .catch(()=>{
+          reject(false)
+        })
+      })
+    }
+
+
+
+    // 下载网络图片
+    downLoad(){
+      let  that = this;
+      wx.downloadFile({
+        url: 'https://img.honglounews.com/20240130113109-4475.jpg_adm0',
+        success: function (res) {
+          that.state.bgImgPath = res.tempFilePath;
+          that.openShareImg();
+        }
+      })
+    }
+
+    // 绘制图片
+    wxDrawImage(callback){
+      const {canvasHeight} = this.state
+      Taro.showLoading({ title: '海报生成中', mask: true });
+      const WIDTH = 560;
+      var ctx = Taro.createCanvasContext('shareCanvas',this.$scope)
+          ctx.fillStyle="#fff";
+          ctx.fillRect(0,0,WIDTH,canvasHeight);
+          ctx.clearRect(0,0,0,0);
+
+      Taro.getImageInfo({src:this.state.bgImgPath})
+      .then((res)=>{
+        // 获取图片的高度
+        const HEIGHT = res.height;
+        const IMAHEWIDTH = res.width;
+
+        ctx.drawImage(shareImg, (WIDTH-180)/2, -20, 180, 120);
+        ctx.restore();
+
+        ctx.setFillStyle('#333333')   //  颜色
+        ctx.setFontSize(26);
+        let str1 = '限时特卖|03月2610:00-03月28日09:59';
+        let left1 = (WIDTH-(ctx.measureText(str1).width))/2
+        ctx.fillText(str1,left1,88+26); //字体加设计高度
+
+
+
+        ctx.fillStyle="#D8D8D8";
+        ctx.fillRect(0,152,WIDTH,560);
+        ctx.clearRect(0,0,0,0);
+
+
+        ctx.drawImage(this.state.bgImgPath, (WIDTH-IMAHEWIDTH)/2,152+(560-HEIGHT)/2, IMAHEWIDTH, HEIGHT);
+        ctx.restore();
+
+
+        let str2 = '限时特卖限时特限时特卖限时特卖限时特卖';
+        let [contentLeng, contentArray, contentRows] = this.textByteLength(str2, 20);
+        let hs = contentRows*38;
+        for (let m = 0; m < contentArray.length; m++) {
+          ctx.setFillStyle('#333333')
+          ctx.setTextAlign('left');
+          ctx.font = 'normal bold 28px sans-serif';
+          ctx.fillText(contentArray[m],32,786+38*m);
+        }
+
+
+
+
+        // 图片转码
+        ctx.drawImage(baseUrlCode,WIDTH-140-32,754,140,140);
+        ctx.restore();
+
+
+        ctx.setFillStyle('#333333')   //  颜色
+        ctx.setFontSize(32);
+        let str4 = '¥2999.00';
+        let left4 = ctx.measureText(str4).width
+        ctx.font = 'normal bold 32px sans-serif'
+        ctx.fillText(str4,32,798+hs)
+
+
+
+
+
+        let str5 = '跨境商品';
+        let width5 = ctx.measureText(str5).width
+        ctx.fillStyle='#FFDDDD';
+        ctx.fillRect(left4+32+16,766+hs,width5+20,38)
+
+
+
+        ctx.setFillStyle('#E61717');
+        ctx.setFontSize(24)
+        ctx.font = 'normal lighter 24px sans-serif'
+        ctx.fillText(str5,left4+32+41,795+hs);
+
+
+
+
+        ctx.setFillStyle('#999999')   //  颜色
+        ctx.setFontSize(26);
+        let str6 = '来自蓝鲸淘小店';
+        ctx.fillText(str6,32,canvasHeight-38); //字体加设计高度
+
+
+        ctx.setFillStyle('#999999')   //  颜色
+        ctx.setFontSize(26);
+        let str7 = '长按识别二维码';
+        let width7 = ctx.measureText(str7).width
+        ctx.fillText(str7,WIDTH-width7-32,canvasHeight-38); //字体加设计高度
+
+
+        ctx.draw(true,()=>{
+          callback && callback()
+        })
+      })
+
+    }
+
+
+    // 授权提示
+    showModal(){
+      let that = this;
+      Taro.showModal({
+        title: '授权提示',
+        content: '打开保存图片权限',
+        success (res) {
+          if (res.confirm) {
+          Taro.openSetting({
+            success (res) {
+              if(res.authSetting['scope.writePhotosAlbum']){
+                // 调用画图
+                that.wxDrawImage(()=>{
+                  that.saveImage()
+                })
+              }else{
+                Taro.showToast({
+                  title: '授权失败',
+                  icon: 'none'
+                });
+              }
+            },
+            fail(){
+              Taro.showToast({
+                title: '授权失败',
+                icon: 'none'
+              });
+            }
+          })
+          } else if (res.cancel) {
+            Taro.showToast({
+              title: '授权失败',
+              icon: 'none'
+            });
+          }
+        }
+      })
+    }
+
+
+    // 打开分享
+    openShareImg(){
+      this.getSetting().then((res)=>{
+        if(!res){
+          this.showModal()
+        }else{
+          this.wxDrawImage(()=>{
+            this.saveImage()
+          })
+        }
+      }).catch(()=>{
+        this.showModal()
+      })
+    }
+
+
+
+    openImage(){
+
+    }
+
+    // 图片保存
+    saveImage(){
+      let that = this;
+      const {canvasWidth, canvasHeight} = this.state
+      Taro.canvasToTempFilePath({
+        width: canvasWidth,
+        height: canvasHeight,
+        destWidth: canvasWidth * 2,
+        destHeight: canvasHeight * 2,
+        x: 0,
+        y: 0,
+        canvasId: 'shareCanvas',
+        success: function(res) {
+          Taro.hideLoading();
+          that.setState({
+            posterImage: res.tempFilePath
+          })
+        }
+      },that.$scope)
+    }
+
+    /**
+      * 生成海报获取文字
+      * @param string text 为传入的文本
+      * @param int num 为单行显示的字节长度
+      * @return array
+    */
+    textByteLength (text, num){
+      let strLength = 0;
+      let rows = 1;
+      let str = 0;
+      let arr = [];
+      for (let j = 0; j < text.length; j++) {
+        if (text.charCodeAt(j) > 255) {
+          strLength += 2;
+          if (strLength > rows * num) {
+            strLength++;
+            arr.push(text.slice(str, j));
+            str = j;
+            rows++;
+          }
+        } else {
+          strLength++;
+          if (strLength > rows * num) {
+            arr.push(text.slice(str, j));
+            str = j;
+            rows++;
+          }
+        }
+      }
+      arr.push(text.slice(str, text.length));
+      return [strLength, arr, rows]   //  [处理文字的总字节长度,每行显示内容的数组,行数]
+    }
+
+    render () {
+      const {canvasWidth, canvasHeight, posterImage} = this.state
+      const style=  {
+        position: 'fixed',
+        top: 0,
+        left: '1000px'
+      }
+    return (
+      <View className='canvas'>
+        <Canvas canvasId="shareCanvas" style={{width:canvasWidth+'px',height:canvasHeight+'px',...style}}></Canvas>
+        <AtButton type='primary' circle onClick={this.downLoad.bind(this)}>canvas保存图片</AtButton>
+        { posterImage ? (<Image className='img' src={posterImage} style={{width:canvasWidth/2+'px',height:canvasHeight/2+'px',backgroundColor:'#fff'}}></Image>) : ''}
+      </View>
+    )
+  }
+}

+ 24 - 0
src/pagesRoom/testCanvas/base64src.js

@@ -0,0 +1,24 @@
+const fsm = wx.getFileSystemManager();
+const FILE_BASE_NAME = 'tmp_base64src'; //自定义文件名
+ 
+function base64src(base64data, cb) {
+  const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || [];
+  if (!format) {
+    return (new Error('ERROR_BASE64SRC_PARSE'));
+  }
+  const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
+  const buffer = wx.base64ToArrayBuffer(bodyData);
+  fsm.writeFile({
+    filePath,
+    data: buffer,
+    encoding: 'binary',
+    success() {
+      cb(filePath);
+    },
+    fail() {
+      return (new Error('ERROR_BASE64SRC_WRITE'));
+    },
+  });
+};
+
+export default base64src;