备注:我是使用STS临时授权方式,则需要指定该项为SecurityToken的值,在formData中设置‘x-oss-security-token’,要不然会403报错
uploadAliyun.ts
import './hmac.js';
import './sha1.js';
import Base64 from './Base64'; //Base64,hmac,sha1,crypto相关算法
//参考这里https://github.com/peterhuang007/weixinFileToaliyun.git
import Crypto from './crypto.js';
const clint = {
rootDir: '', //默认存在根目录,可根据需求改
accessKeyId: '',
accessKeySecret: '',
stsToken: '',
timeout: 87600, //这个是上传文件时Policy的失效时间
};
export const uploadFile = (
env: any,
options: {
file: any;
dir: string;
failCallback?: (arg0: Error) => void;
successCallback?: (arg0: any) => void;
}
) => {
clint.rootDir = `https://${env.bucket}.${env.endpoint}`; //默认存在根目录,可根据需求改
clint.accessKeyId = env.accessKeyId;
clint.accessKeySecret = env.accessKeySecret;
clint.stsToken = env.stsToken;
if (!options.file.path || options.file.path.length < 9) {
wx.showModal({
title: '图片错误',
content: '请重试',
showCancel: false,
});
return;
}
let timestamp = new Date().getTime(); // 返回数值单位是毫秒
const fileUrl = `${options.dir}/${timestamp}_${options.file.name}`; // dir表示要传到这个目录下
const policyBase64 = getPolicyBase64();
const signature = getSignature(policyBase64); //获取签名
wx.uploadFile({
url: clint.rootDir,
filePath: options.file.path,
name: 'file', //必须填file
formData: {
key: fileUrl,
policy: policyBase64,
signature: signature,
OSSAccessKeyId: clint.accessKeyId,
'x-oss-security-token': clint.stsToken, // 访问是使用STS临时授权,则需要指定该项为SecurityToken的值
success_action_status: '200',
},
success: function (res) {
if (res.statusCode != 200) {
typeof options.failCallback === 'function' &&
options.failCallback(new Error('上传错误:' + JSON.stringify(res)));
return;
}
// console.log('上传图片成功', res);
typeof options.successCallback === 'function' &&
options.successCallback(res);
},
fail: function (err) {
typeof options.failCallback === 'function' && options.failCallback(err);
},
});
};
const getPolicyBase64 = function () {
let date = new Date();
date.setHours(date.getHours() + clint.timeout);
let srcT = date.toISOString();
const policyText = {
expiration: srcT, // 设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
conditions: [
['content-length-range', 0, 5 * 1024 * 1024], // 设置上传文件的大小限制,5mb
],
};
const policyBase64 = Base64.encode(JSON.stringify(policyText));
return policyBase64;
};
const getSignature = function (policyBase64: any) {
const accessKey = clint.accessKeySecret;
const bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, accessKey, {
asBytes: true,
});
const signature = Crypto.util.bytesToBase64(bytes);
return signature;
};
页面中调用
questions({
method: 'POST',
data: this.form,
}).then((res: any) = > {
for (let file of this.fileUpload) {
uploadFile(this.OssSign, {
file: file,
dir: 'iot',
successCallback(res) {
// console.log(res);
},
});
}
wx.switchTab({
url: '/pages/question/index/main',
});
});
参考链接:https://www.jianshu.com/p/34d6dcbdc2e5
来源:oschina
链接:https://my.oschina.net/u/4287145/blog/4307855