阿里云 OSS 使用 STS 以及 Vue.js 上传图像
零 阿里云:为Bucket设置跨域
将allowed origins(来源)设置成 *
将allowed methods(允许methods)设置成 PUT, GET, POST, DELETE, HEAD
将allowed headers(允许headers)设置成 *
将expose headers(暴露headers)设置成 ETag (这里需要换行) x-oss-request-id
一 阿里云:创建一个RAM用户专门用来上传图像
假如此用户为 my_ram_user
二 阿里云:为用户 my_ram_user 创建访问密钥 AccessKey
三 阿里云:为用户 my_ram_user 添加权限 AliyunSTSAssumeRoleAccess
上面三步达到了一个目的: 创建一个专用的用户,此用户有可以进行 STS 分配的权力
四 阿里云:创建一个角色
假如此角色为 my_role
记住此角色的 arn ,在代码里要用
五 阿里云:创建一个 权限策略
假如此权限策略为 my_policy
内容为:
将 [BUCKET] 替换为 实际的 bucket
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:[BUCKET]",
"acs:oss:*:*:[BUCKET]/*"
]
}
]
}
六 阿里云:为 my_role 添加权限 my_policy
七 IDE:添加引用
aliyun-net-sdk-Core.dll
aliyun-net-sdk-Sts.dll
Aliyun.OSS.dll
八 写生成STS的代码
//example:REGIONID = oss-cn-hangzhou
//STS_ENDPOINT = sts.cn-hangzhou.aliyuncs.com
DefaultProfile.AddEndpoint(REGIONID, REGIONID, "Sts", STS_ENDPOINT);
IClientProfile profile = DefaultProfile.GetProfile(REGIONID, ACCESSKEYID, ACCESSKEYSECRET);
DefaultAcsClient client = new DefaultAcsClient(profile);
// 构造AssumeRole请求
AssumeRoleRequest request = new AssumeRoleRequest();
request.AcceptFormat = FormatType.JSON;
// 指定角色Arn
request.RoleArn = ROLEARN;
request.RoleSessionName = "PhotoUploaderRole_" + Juyi.Algorithm.Randomicity.Nanoid.Generate();
// 可以设置Token有效期,可选参数,默认3600秒;
request.DurationSeconds = DurationSeconds;
// request.DurationSeconds = 3600;
// 可以设置Token的附加Policy,可以在获取Token时,通过额外设置一个Policy进一步减小Token的权限;
// request.Policy="<policy-content>"
try {
AssumeRoleResponse response = client.GetAcsResponse(request);
var data = new OssSStData();
data.access_key_id = response.Credentials.AccessKeyId;
data.access_key_secret = response.Credentials.AccessKeySecret;
data.security_token = response.Credentials.SecurityToken;
data.expiration = DateTime.Parse(response.Credentials.Expiration).ToLocalTime().ToUnixTimestampSeconds();
data.bucket = BUCKET;
data.region = REGIONID;
////Token过期时间;服务器返回UTC时间,这里转换成北京时间显示;
//Console.WriteLine("Expiration: " + DateTime.Parse(response.Credentials.Expiration).ToLocalTime());
return data;
}
catch (Exception ex) {
throw;
Log.Error("OssRule.GetAvatarUploadSST", ex);
return null;
}
九 Vue:安装包 npm install ali-oss
十 vue:主要上传代码
const client = new OSS({
region : sts.region, // 请设置成你的路径地址
accessKeyId : sts.access_key_id, // 请设置成你的
accessKeySecret: sts.access_key_secret, // 请设置成你的
bucket : sts.bucket, // 请设置成你的
stsToken : sts.security_token,
secure : true, // 上传链接返回支持https
});
//imageArrayBuffer 是图像数据
await client.put('111.png', new OSS.Buffer(imageArrayBuffer));