阿里OSS对象存储
前几天公司要求做一个app上传视频和图文的功能,针对视频与图片的上传,公司这边走的是阿里的OSS对象存储。
在之前的测试过程中,部分视频上传会失败。由于我对这个OSS存储不是很熟,因此我咨询了阿里的售后工程师,结果发现:我挺瞎的……[捂脸]
与阿里售后工程师聊天记录如下:
问题描述:有些几M的视频是可以上传成功的,但是超过几M之后就不能上传成功了,但是具体几M,我还不清楚……,也没有办法弹窗提示用户。
在提供了一系列的上传参数后,阿里工程师回复如下:
在前端代码中,我找到了这个content-length-range
字段,然后将参数调大,问题解决……
后面附上Uniapp上传视频到阿里OSS对象存储后,返回网址的代码:
async chooseVideo() {
let _this = this;
console.log(_this.editorCtx);
uni.chooseVideo({
count: 1, //最多可以选择的图片张数,默认9
sizeType: ['compressed'], //original 原图,compressed 压缩图,默认二者都有
sourceType: ['album', 'camera'], //album 从相册选图,camera 使用相机,默认二者都有
success: (respone) => {
uni.showLoading({
title: '加载中'
});
console.log(respone.size);
if(respone.size > 100 *1024 *1024){
uni.showToast({
title:"当前视频超过100M",
icon:"none"
})
return;
}
_this.$request.urlRequest(
'/gate/oss/token', {},
'GET',
(res) => {
if (res.code == 200) {
let data = res.result;
console.log(data);
let env = {
uploadImageUrl: 'https://58d.oss-cn-hangzhou.aliyuncs.com/', // 默认存在根目录,可根据需求改
AccessKeySecret: data.AccessKeySecret, // AccessKeySecret 去你的阿里云上控制台上找
OSSAccessKeyId: data.AccessKeyId, // AccessKeyId 去你的阿里云上控制台上找
stsToken: data.SecurityToken,
timeout: 87600 //这个是上传文件时Policy的失效时间
}
let dir = 'shipin/';
console.log(respone);
let filePath = respone.tempFilePath;
const aliyunFileKey = dir + new Date().getTime() + Math.floor(Math.random() * 150) + '.mp4';
const aliyunServerURL = env.uploadImageUrl; //OSS地址,需要https
const accessid = env.OSSAccessKeyId;
const policyBase64 = _this.getPolicyBase64(env);
const signature = _this.getSignature(policyBase64, env); //获取签名
const stsToken = env.stsToken;
let param = {
'key': aliyunFileKey,
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'signature': signature,
'success_action_status': '200',
'x-oss-security-token': stsToken,
'stsToken': stsToken
};
uni.uploadFile({
url: "https://58d.oss-cn-hangzhou.aliyuncs.com/", //开发者服务器 url
filePath: filePath, //要上传文件资源的路径
name: 'file', //必须填file
formData: param,
success: (res) => {
uni.hideLoading();
_this.detail.media = aliyunServerURL + aliyunFileKey;
console.log(_this.detail.media);
},
fail: (err) => {
uni.hideLoading();
},
})
}
}
)
}
});
},
getSignature(policyBase64, env) {
const accesskey = env.AccessKeySecret;
const bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, accesskey, {
asBytes: true
});
const signature = Crypto.util.bytesToBase64(bytes);
return signature;
},
getPolicyBase64(env) {
let date = new Date();
date.setHours(date.getHours() + env.timeout);
let srcT = date.toISOString();
const policyText = {
"expiration": srcT, //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
"conditions": [
["content-length-range", 0, 100 * 1024 * 1024] // 设置上传文件的大小限制,50mb
]
};
const policyBase64 = base64.encode(JSON.stringify(policyText));
return policyBase64;
},