前言
接入oss必须有这两个文档基础
使用STS临时访问凭证访问OSS_对象存储(OSS)-阿里云帮助中心
前端上传跨域
正文
sts前后端通用,开通图示
AliyunSTSAssumeRoleAccess
后端实现代码
public static void main(String[] args) {
String regionId = "cn-hangzhou";
String endpoint = "sts.cn-hangzhou.aliyuncs.com";
String accessKeyId = "accessKeyId"; //用户提供
String accessKeySecret = "accessKeySecret";//用户提供
String roleArn = "acs:ram::roleArn:role/ramoss";//角色提供
String roleSessionName = "roleSessionName";// 自定义
String bucket = "bucket"; // 对应创建buket 前端上传记得开跨域
String policy = "{\n" +
" \"Version\": \"1\", \n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": [\n" +
" \"oss:PutObject\"\n" +
" ], \n" +
" \"Resource\": [\n" +
" \"acs:oss:*:*:sc-sale-servcie/test/*\" \n" +
" ], \n" +
" \"Effect\": \"Allow\"\n" +
" }\n" +
" ]\n" +
"}";
Long durationSeconds = 3600L;
try {
DefaultProfile.addEndpoint("", regionId, "Sts", endpoint);
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
// 构造client。
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
//request.setPolicy(policy);
request.setDurationSeconds(durationSeconds);
// 如果前端上传这个给前端 把跨域打开
final AssumeRoleResponse response = client.getAcsResponse(request);
System.out.println("Expiration: " + response.getCredentials().getExpiration());
System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
System.out.println("RequestId: " + response.getRequestId());
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build("https://oss-cn-hangzhou.aliyuncs.com", response.getCredentials().getAccessKeyId(), response.getCredentials().getAccessKeySecret(), response.getCredentials().getSecurityToken());
PutObjectRequest putObjectRequest = new PutObjectRequest("reformer", "1/reformer.sql", new File("/Users/xushouchun/IdeaProjects/REformer-boot/fromer-start/src/main/resources/database/reformer.sql"));
try {
// 上传文件。
PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
System.out.println("putObjectResult = " + JSON.toJSONString(putObjectResult));
// copy
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucket, "1/reformer.sql", bucket, "1/sql.reformer");
ossClient.copyObject(copyObjectRequest);
// 生成下载URL
Date expirationDate = new Date(new Date().getTime() + durationSeconds); // URL 的有效期
GeneratePresignedUrlRequest requests = new GeneratePresignedUrlRequest(bucket, "1/reformer.sql");
requests.setExpiration(expirationDate);
ossClient.generatePresignedUrl(requests);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
} catch (ClientException e) {
System.out.println("Failed:");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
System.out.println("RequestId: " + e.getRequestId());
}
}
总结
后端代码已经提供,前端就比较简单了,拿到钥匙直接upload就可以了。 一般脚手架都有,凭借url即可
前端文档: sts前端上传代码