提前下载 crypto-js 和 js-base64 包 和后端要有STS服务
npm install crypto-js js-base64
import crypto from ‘crypto-js’;
import { Base64 } from ‘js-base64’;
签名算法
//signature.js
import crypto from 'crypto-js';
import { Base64 } from 'js-base64';
// 计算签名。
function computeSignature(accessKeySecret, canonicalString) {
return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret));
}
const date = new Date();
date.setHours(date.getHours() + 1);
const policyText = {
expiration: date.toISOString(), // 设置policy过期时间。
conditions: [
// 限制上传大小。
["content-length-range", 0, 1024 * 1024 * 1024],
],
};
export function getFormDataParams() {
const policy = Base64.encode(JSON.stringify(policyText)) // policy必须为base64的string。
const signature = computeSignature('AccessKeySecret 后端使用STS服务生成的', policy)
const formData = {
OSSAccessKeyId: "AccessKeyId 后端使用STS服务生成的",
signature,
policy,
'x-oss-security-token': "SecurityToken 后端使用STS服务生成的",
}
return formData
}
上传
const signature = require("./signature.js"); //签名算法
// 获取文件后缀
const getSpecifyTxt=(str, findStr = ".")=>{
if (!str) return null;
const partition = str?.lastIndexOf(findStr);
return {
name: str.substring(0, partition),
suffix: str.substring(partition, str.length)
};
}
/*
*上传文件到阿里云oss
*@param - filePath :图片的本地资源路径
*/
const uploadFile = function (filePath) {
const { suffix } = getSpecifyTxt(filePath), aliyunFileKey = '阿里云OSS上传文件夹,需要在OSS上面配置'+ new Date().getTime() + Math.floor(Math.random() * 150) + suffix;
const formData = {
key:aliyunFileKey, // 阿里云OSS存储路径和文件名称
'success_action_status': '200', // 不设置返回的是204
...signature.getFormDataParams()
}
wx.uploadFile({
url: 'https://xxx.oss-cn-hangzhou.aliyuncs.com',//开发者服务器 url xxx 为自定义的域名前缀
filePath: filePath,//要上传文件资源的路径
name: 'file',//必须填file
formData: formData,
success: function (res) {
console.log(res)
if (res.statusCode != 200) {
return;
}else{
console.log('上传成功')
}
},
fail: function (err) {
console.log(err,'上传错误');
},
})
}
module.exports = uploadFile;