不多说了,直接上代码,下面是前端代码
<button id="send">
点击
</button>
<script src="jquery-1.11.3.min.js"></script>
<script src="aliyun-oss-sdk.js"></script>
<script>
var blob = dataURLtoBlob('data:text/plain;base64,YWFhYWFhYQ==');
$('#send').click(function(){
$.ajax({
type: "GET",
url: "http://localhost:7002/crm-workbench/ali-sts-token",
data: {
},
dataType: "JSON",
success: function(data){
console.log(data.data.toString());
let client = new OSS({
accessKeyId: data.data.AccessKey,
accessKeySecret: data.data.AccessKeySecret,
stsToken: data.data.SecurityToken,
bucket: data.data.bucket,
endpoint: data.data.endpoint
});
console.log(client);
console.log(blob);
// blob 转 arrayBuffer
var reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onload = function (event) {
//arrayBuffer 转 buffer对象
var buffer = new OSS.Buffer(event.target.result);
try {
let result = client.put('aa.txt',buffer)
.then((results) => {
})
.catch(e => {
})
} catch (e) {
}
}
}
});
});
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
</script>
后端生产STSToken的业务方法
@Override
public String getToken() {
JSONObject result = new JSONObject();
Map<String, String> tokenMessage = getSTSToken();
if (tokenMessage.size() == 0) {
return JsonUtils.getErrorJsonObj("获取Token出错").toString();
}
result.put("Expiration", tokenMessage.get("Expiration"));
result.put("AccessKey", tokenMessage.get("AccessKey"));
result.put("AccessKeySecret", tokenMessage.get("AccessKeySecret"));
result.put("SecurityToken", tokenMessage.get("SecurityToken"));
result.put("endpoint", endpoint);
result.put("bucket", ALIYUN_BUCKET_RESOURCE);
return JsonUtils.getJsonObjWithData("获取成功", JSONObject.toJSONString(result)).toString();
}
/**
* 获取STStoken
*
* @return
*/
private Map<String, String> getSTSToken() {
Map<String, String> tokenMessage = new HashMap<String, String>();
String policy = null;
try {
// 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
DefaultProfile.addEndpoint("", "", "Sts", endpoint);
// 构造default profile(参数留空,无需添加region ID)
IClientProfile profile = DefaultProfile.getProfile("cn-beijing", accessKeyId, accessKeySecret);
// 用profile构造client
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy); // Optional
request.setDurationSeconds(900L);
final AssumeRoleResponse response = client.getAcsResponse(request);
tokenMessage.put("Expiration", response.getCredentials().getExpiration());
tokenMessage.put("AccessKey", response.getCredentials().getAccessKeyId());
tokenMessage.put("AccessKeySecret", response.getCredentials().getAccessKeySecret());
tokenMessage.put("SecurityToken", response.getCredentials().getSecurityToken());
tokenMessage.put("RequestId", response.getRequestId());
} catch (ClientException e) {
logger.error("Error code: ", e.getErrCode());
logger.error("Error message: ", e.getErrMsg());
logger.error("RequestId: ", e.getRequestId());
}
return tokenMessage;
}
具体的细节可以参考官方文档:https://helpcdn.aliyun.com/document_detail/100624.html