前言
之前寫過一篇微信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="width: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);
}