客户端获取STS临时账号并生成签名
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],
],
};
async function getFormDataParams() {
const credentials = await axios.get('/getToken') // 这是请求后端接口,获得stsToken临时令牌相关信息
const policy = Base64.encode(JSON.stringify(policyText)) // policy必须为base64的string。
const signature = computeSignature(credentials.AccessKeySecret, policy)
const formData = {
OSSAccessKeyId: credentials.AccessKeyId,
signature,
policy,
'x-oss-security-token': credentials.SecurityToken
}
return formData
}
用微信小程序自带的wx.uploadFile()直传,不过我是改用uniapp自带uni.uploadFile(), 他们的用法无大区别,后者兼容性应该好一点
const host = '<host>';
const signature = '<signatureString>';
const ossAccessKeyId = '<accessKey>';
const policy = '<policyBase64Str>';
const key = '<object name>';
const securityToken = '<x-oss-security-token>';
const filePath = '<filePath>'; // 待上传文件的文件路径。
wx.uploadFile({
url: host, // 开发者服务器的URL。
filePath: filePath,
name: 'file', // 必须填file。
formData: {
key,
policy,
OSSAccessKeyId: ossAccessKeyId,
signature,
// 'x-oss-security-token': securityToken // 使用STS签名时必传。
},
success: (res) => {
if (res.statusCode === 204) {
console.log('上传成功');
}
},
fail: err => {
console.log(err);
}
});
参考资料:阿里云官方文档说的
4 个回复
刘邦修车网 - 工具APP
这个论坛很少有人实际解决问题,差评
1***@qq.com
app端也遇到了
z***@163.com
怎么解决的
2020-09-27 17:23
wbkou
你好,这个问题最终怎么解决的
9***@qq.com
客户端获取STS临时账号并生成签名
用微信小程序自带的wx.uploadFile()直传,不过我是改用uniapp自带uni.uploadFile(), 他们的用法无大区别,后者兼容性应该好一点
参考资料:阿里云官方文档说的