其实阿里云oss存储对象下的最佳实践中写的比较完整,但是在开发时仍然碰到了许多坑。
阿里云链接
流程
1.服务端使用sdk进行请求,获取上传凭证UploadAuth
以及地址UploadAddress
并返回给客户端
2.客户端得到上传凭证以及地址解析
代码案例 可直接食用
Crypto 和base64 下载 其实后端加密更加安全,也是官网推荐使用的
const Crypto = require('./cryptojs/cryptojs.js').Crypto;
const base64 = require('./cryptojs/base64.js').Base64;
upload(){
//解析上传凭证和地址 这里写死,应该由后端返回
let UploadAddress = "xxx"
let UploadAuth = "xxx"
let UploadAddressObj =JSON.parse(base64.decode(UploadAddress))
let UploadAuthObj = JSON.parse(base64.decode(UploadAuth))
let aliOssParams = that.aliOssParams({
aid:UploadAuthObj.AccessKeyId,
aky:UploadAuthObj.AccessKeySecret,
});
wx.uploadFile({
url: aliOssParams.host,
filePath: res.tempFilePath,
name: 'file',
header:{
'Content-Type':'multipart/form-data'
},
formData: {
name: res.tempFilePath,
//目录,这里我使用了返回的文件名 官网写死使用`${filename}`,但是我传不上去
key: UploadAddressObj.FileName,
policy:aliOssParams.policy,//上传阿里云的加密策略
OSSAccessKeyId: aliOssParams.aid,//自己阿里云的aid
success_action_status: "200",
signature: aliOssParams.signature,//上传阿里云的签名
'x-oss-security-token':UploadAuthObj.SecurityToken
},
success: function (res) {
console.log('上传成功',res);
},
fail:function(err){
console.log('上传失败',err);
},
complete(){
console.log('调用上传');
}
})
},
aliOssParams(opt){
let aid = opt.aid ;//后台返回的阿里云的accessid 由UploadAuth解析而来
let aky = opt.aky ;//后台返回阿里云的accesskeySecret 由UploadAuth解析而来
let host = "https://xxx.oss-cn-shanghai.aliyuncs.com";//由UploadAddress解析拼接而来
let policyText = {
"expiration": "2022-01-01T12:00:00.000Z",//上传的文件失效日期自己定义
"conditions": [
["content-length-range", 0, 1048576000]//上传的内容大小,自己定义
]
};
let policy = base64.encode(JSON.stringify(policyText));//生成的加密策略
let bytes = Crypto.HMAC(Crypto.SHA1, policy, aky, { asBytes: true }) ;
let signature = Crypto.util.bytesToBase64(bytes);//生成的签名
return {
policy: policy,
signature:signature,
aid:aid,
host: host
}
},
第一次开发遇到的问题:
1.各个参数含义
key: UploadAddressObj.FileName,//指定目录
policy:aliOssParams.policy,//上传阿里云的加密策略
OSSAccessKeyId: aliOssParams.aid,// 由UploadAuth解析而来
success_action_status: "200",
signature: aliOssParams.signature,//上传阿里云的签名
'x-oss-security-token':UploadAuthObj.SecurityToken// 由UploadAuth解析而来
2.阿里云需要策略权限需要开通oss上传权限
3.报错提示不明确
1. key参数不对竟然会报policy不对.....
2.必须由服务端sdk发送预请求,否则回报ossId不存在
忘了...