zoukankan      html  css  js  c++  java
  • 微信公众号通过图片选取接口上传到阿里oss

    前言

    之前写过一篇微信JS-SDK的使用方法,可进行参考
    https://www.cnblogs.com/fozero/p/10256862.html

    配置并调用公众号接口权限

    1、配置权限微信公众号接口,添加如下权限

    jsApiList: [
              'chooseImage',
              'getLocalImgData',
            ]
    

    2、拍照或选取图片,拿到base64位图片地址

    wx.chooseImage({
          count: 1, // 默认9
          sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
          sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
          success: function (res) {
            // var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
            // 获取本地图片
            wx.getLocalImgData({
              localId: res.localIds[0], // 图片的localID
              success: function (res) {
                var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
              }
            });
          }
        });
    

    这里有个坑:
    微信公众号选择图片显示报错wx.getLocalImgData is not a function

    调用之前需在jsApiList[]中添加getLocalImgData权限

    添加之后还是无法获取权限,后发现微信js版本问题(在jweixin1.0.0无法使用)

    替换使用最新版本

    http://res2.wx.qq.com/open/js/jweixin-1.4.0.js
    

    使用阿里oss浏览器端sdk上传图片

    3.1、文档查看
    https://www.alibabacloud.com/help/zh/doc-detail/32069.htm?spm=a2c63.p38356.a3.7.26855ac51uabIJ
    https://github.com/ali-sdk/ali-oss

    3.2、浏览器引用

    <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-6.1.0.min.js"></script>
    
    let client = new OSS({
    			accessKeyId: result.AccessKeyId,
    			accessKeySecret: result.AccessKeySecret,
    			stsToken: result.SecurityToken,//安全性考虑,建议通过服务器获取该token
    			endpoint: '<oss endpoint>',
    			bucket: '<Your bucket name>'
    		  });
    
    //storeAs表示上传的object name , file表示上传的文件
    		  client.multipartUpload(storeAs, file).then(function (result) {
    			console.log(result);
    		  }).catch(function (err) {
    			console.log(err);
    		  });
    

    multipartUpload第二个参数支持blob和file对象,这里需要注意的是我们在微信公众号拿到的图片地址是base64位,上传之前将其转换成blob或者file对象格式

     // base64转blob
                function dataURLtoBlob(dataurl) {
                  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
                    bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
                  while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                  }
                  return new Blob([u8arr], { type: mime });
                }
    
                //base64转file对象
                function dataURLtoFile(dataurl, filename) {
                  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
                    bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
                  while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                  }
                  return new File([u8arr], filename, { type: mime });
                }
    

    坑:
    现在最新sdk版本是6.1.0,可以通过https://github.com/ali-sdk/ali-oss/tree/master/dist获取,由于是网上找的代码,版本原因
    之前版本获取oss对象的方式是new OSS.Wrapper ,最新版本已换成new OSS,传递参数也变了,region已经换成endpoint

    let client = new OSS.Wrapper({
                  region: 'oss-cn-hangzhou',
                  accessKeyId: '',
                  accessKeySecret: '',
                  bucket: ''
                })
    

    完整代码

    <img style="300px;" class="J_img" src="" alt="">
    <div class="J_upload">上传图片</div>
    
    // 图片上传
      $('.J_upload').click(function () {
        // 选择手机图片
        wx.chooseImage({
          count: 1, // 默认9
          sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
          sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
          success: function (res) {
            // var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
            // 获取本地图片
            wx.getLocalImgData({
              localId: res.localIds[0], // 图片的localID
              success: function (res) {
                var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
                let client = new OSS({
                  accessKeyId: '',
                  accessKeySecret: '',
                  // stsToken: result.SecurityToken,
                  endpoint: '',
                  bucket: ''
                });
                var fileName = "test/test.jpg"
                var _file = dataURLtoFile(localData, fileName);
                var _blob = dataURLtoBlob(localData);
                client.multipartUpload(fileName, _blob)
                  .then(function (result) {
                    $('.J_img').attr('src', 'https://diankr.oss-cn-beijing.aliyuncs.com/' + result.name+'?i='+Math.random());
                  }).catch(function (err) {
                    console.log('err', err);
                  });
    
                  // base64转blob
                function dataURLtoBlob(dataurl) {
                  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
                    bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
                  while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                  }
                  return new Blob([u8arr], { type: mime });
                }
    
                //base64转file对象
                function dataURLtoFile(dataurl, filename) {
                  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
                    bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
                  while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                  }
                  return new File([u8arr], filename, { type: mime });
                }
              }
            });
          }
        });
      })
    

    最后

    使用js在前端对base64、file、Blob进行互相转换

    1、base64、file对象互转

    https://www.cnblogs.com/MainActivity/p/8550895.html
    
    function dataURLtoFile(dataurl, filename) {//将base64转换为文件
        var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
        while(n--){
            u8arr[n] = bstr.charCodeAt(n);
        }
        return new File([u8arr], filename, {type:mime});
    }
    //将图片转换为Base64
    function getImgToBase64(url,callback){
      var canvas = document.createElement('canvas'),
        ctx = canvas.getContext('2d'),
        img = new Image;
      img.crossOrigin = 'Anonymous';
      img.onload = function(){
        canvas.height = img.height;
        canvas.width = img.width;
        ctx.drawImage(img,0,0);
        var dataURL = canvas.toDataURL('image/png');
        callback(dataURL);
        canvas = null;
      };
      img.src = url;
    }
    getImgToBase64('img/test.png',function(data){
       var myFile = dataURLtoFile(data,'testimgtestimgtestimg');
       console.log(myFile);
    });
    

    2、Base64、 Blob互转

    function dataURLtoBlob(dataurl) {
        var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
            bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
        while (n--) {
            u8arr[n] = bstr.charCodeAt(n);
        }
        return new Blob([u8arr], { type: mime });
    }
    
    function blobToDataURL(blob, callback) {
        let a = new FileReader();
        a.onload = function (e) { callback(e.target.result); }
        a.readAsDataURL(blob);
    }
    
  • 相关阅读:
    linux查看CPU和内存信息
    linux yum命令详解
    查看文件中关键字前后几行的内容
    vue.js+web storm安装及第一个vue.js
    android GPS: code should explicitly check to see if permission is available
    ASP.NET MVC Identity 使用自己的SQL Server数据库
    阿里云服务器,tomcat启动,一直卡在At least one JAR was scanned for TLDs yet contained no TLDs就不动了
    ASP.NET MVC4 MVC 当前上下文中不存在名称“Scripts”
    python 将windows字体中的汉字生成图片的方法
    Java android DES+Base64加密解密
  • 原文地址:https://www.cnblogs.com/fozero/p/10517442.html
Copyright © 2011-2022 走看看