备注:我是使用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\', }); });