前端JS使用STS鉴权上传文件到OSS

不多说了,直接上代码,下面是前端代码

<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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值