Files
gxtyzx-uniapp/src/api/upload.js
T
2024-07-10 13:50:01 +08:00

48 lines
1.6 KiB
JavaScript

const computeSignature = (accessKeySecret, canonicalString) => {
return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret));
}
export async function uploadOssByPath(filePath) {
return new Promise(async (resolve, reject) => {
const date = new Date();
date.setMinutes(date.getMinutes() + 1);
const policyText = {
expiration: date.toISOString(), // 设置policy过期时间。
conditions: [
// 限制上传大小。
["content-length-range", 0, 1024 * 1024 * 1024],
],
};
let sts = uni.getStorageSync('sts');
let stsExpired = uni.getStorageSync('stsExpiredAt');
if(!sts || (stsExpired && dayjs().isBefore(dayjs(stsExpired)))){
const {data: {data: {credentials}}} = await request.get(`${SERVER_API_URL}/oss/getSTSToken`)
uni.setStorageSync('sts', credentials)
uni.setStorageSync('stsExpiredAt', credentials.expiration)
sts = credentials
}
console.log(sts)
const [filename, ext] = filePath.split('.')
const key = `headers/${md5(filename + (Math.random() * 100000))}.${ext}`
const policy = Base64.encode(JSON.stringify(policyText))
const signature = computeSignature(sts.accessKeySecret, policy)
uni.uploadFile({
url: 'https://oss.wsdns.cn',
name: 'file',
filePath,
formData: {
key,
policy,
OSSAccessKeyId: sts.accessKeyId,
signature,
'x-oss-security-token': sts.securityToken
},
success: () => {
resolve(`https://oss.wsdns.cn/${key}`)
},
error: (err) => reject(err)
})
})
}