微信公众号通过图片选取接口上传到阿里oss
配置并调用公众号接口权限
1、配置权限微信公众号接口,添加如下权限
jsApiList: ['chooseImage','getLocalImgData',]
2、拍照或选取图片,拿到base64位图片地址
wx.chooseImage({count: 1, // 默认9sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有success: function (res) {// var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片// 获取本地图片wx.getLocalImgData({localId: res.localIds[0], // 图片的localIDsuccess: 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,//安全性考虑,建议通过服务器获取该tokenendpoint: '<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转blobfunction 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="width:300px;" class="J_img" src="" alt="">
<div class="J_upload">上传图片</div>// 图片上传$('.J_upload').click(function () {// 选择手机图片wx.chooseImage({count: 1, // 默认9sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有success: function (res) {// var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片// 获取本地图片wx.getLocalImgData({localId: res.localIds[0], // 图片的localIDsuccess: 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转blobfunction 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.htmlfunction 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);
}
作者:fozero
文章出处:https://www.cnblogs.com/fozero
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
微信公众号通过图片选取接口上传到阿里oss相关推荐
- vue开发微信公众号调用相机和相册(上传到自己的服务器)
第一步: 下载weixin-js-sdk npm install weixin-js-sdk 第二步: 在需要使用的页面引入sdk import wx from "weixin-js-sdk ...
- vue 微信公众号获取图片素材接口
看代码 getImage(){this.$http.put(wechatapi+'/token?access-token='+this.token).then((res)=> {var post ...
- ios 微信公众号 上传图片至服务器,axios 上传文件到微信公众号接口提示503错误...
解决方案如下 import axios from 'axios' import * as fs from 'fs' import { HttpDelegate } from './HttpKit' i ...
- python公众号留言功能_Python实现的微信公众号群发图片与文本消息功能实例详解...
本文实例讲述了Python实现的微信公众号群发图片与文本消息功能.分享给大家供大家参考,具体如下: 在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_ ...
- python公众号留言功能详情_Python实现的微信公众号群发图片与文本消息功能实例详解...
本文实例讲述了Python实现的微信公众号群发图片与文本消息功能.分享给大家供大家参考,具体如下: 在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_ ...
- 第三方网站调用微信公众号的图片被禁止
第三方网站调用微信公众号的图片被禁止 借助搜狗搜索的接口来处理,让后端转码,前端调用 <meta name="referrer" content="no-refer ...
- 方便微信公众号征集图片视频的小程序
作为自媒体运营者,经常需要在公众号上组织一些活动,需要征集视频.征集照片等,原来都是通过公众号后台回复.邮箱等方式完成收集,但是多渠道维护困难,管理起来不方便,需要花费大量的时间去整理作品,汇总投稿人 ...
- 开启微信公众号服务器后面的开发,微信公众号开发者权限 开通接口与配置服务器...
微信公众号开发者权限 开通接口与配置服务器 作为微信公众平台的开发者,是可以修改自定义菜单的.每个公众号下端都会有三个或者是四个菜单.关于菜单的内容以及显示的方式都是可以通过后台的开发者权限更改的.如 ...
- 解决URLToPDF 微信公众号文章图片不显示问题(全网唯一方案)
文章目录 有几种物理方法可以将URL(网页地址)转换成PDF文件: Python 代码实现: Java 实现 方式: java 调用 wkhtmltopdf 实现URLToPDF(基础版) java ...
最新文章
- c++ssh连接_一步步使SSH连接您的github仓库
- feign 请求超时,请求没有到服务端
- curl可以访问但httpclient不能访问_exta进程不能访问+ASM实例的解决方法
- [计组]寄存器的基本含义
- 每日英语:Go Ahead, Hit the Snooze Button
- Retrofit使用
- python钓鱼网站_学习笔记6.0 Django入门创建一个钓鱼网站
- java级别_Java的访问级别(深入版)
- 如何建立最初的三层架构[转]
- 疯狂连连看之开发游戏界面组件
- 阿里架构师的工作总结:Spring Cloud在架构演进中起到的作用
- cmd for语句的用法
- SAP NOTE远程下载及电子证书配置
- CAM350测量pcb尺寸的操作方法
- 用excel制作门店流水日常
- 设计模式笔记2-简单工厂模式(带有自制UML类图)
- 486微型计算机的字长是 8位 16位 32位 64位,大学计算机基础考试试题
- Android Studio 插件-Android Styler 的使用 (转)
- java applet编程_JavaApplet编程技巧
- Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之 Response Selection
热门文章
- 手机第三方支付产品安全性
- 自从玩了我自己创造的这个c++游戏后,总感觉一分钟好长(火龙征战V1.0.1)
- 工具分享:elasticsearch-7.3.1请自行下载(Linux、windows_64)(附下载链接)
- 斐波那契兔子问题(递归实现)
- 怎么输入版权符号(?)
- java将长网址转换为短网址 用第三方接口 常用于生成二维码时需要
- 写作分享|向SCI期刊投稿时使用什么邮箱比较好?
- 计算机网络-IP和子网掩码及网络划分
- RocketMQ常见问题-消息重复消费和消息重复的问题
- sqlbulkcopy是覆盖式更新吗_名录式的管理,能保护好黄河鱽鱼吗?写在《国家重点保护野生动物名录》首次更新之际...