package com.ard.ossdock.service.impl; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest; import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse; import com.ard.ossdock.config.OssDockConfiguration; import com.ard.ossdock.model.CredentialsDockDTO; import com.ard.ossdock.model.enums.OssDockTypeEnum; import com.ard.ossdock.service.IOssDockService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.io.InputStream; import java.net.URL; import java.util.Date; import java.util.Objects; /** * @author sean * @version 0.3 * @date 2021/12/23 */ @Service @Slf4j public class AliyunDockOssDockServiceImpl implements IOssDockService { private OSS ossClient; @Override public String getOssType() { return OssDockTypeEnum.ALIYUN.getType(); } @Override public CredentialsDockDTO getCredentials() { try { DefaultProfile profile = DefaultProfile.getProfile( OssDockConfiguration.region, OssDockConfiguration.accessKey, OssDockConfiguration.secretKey); IAcsClient client = new DefaultAcsClient(profile); AssumeRoleRequest request = new AssumeRoleRequest(); request.setDurationSeconds(OssDockConfiguration.expire); request.setRoleArn(OssDockConfiguration.roleArn); request.setRoleSessionName(OssDockConfiguration.roleSessionName); AssumeRoleResponse response = client.getAcsResponse(request); return new CredentialsDockDTO(response.getCredentials(), OssDockConfiguration.expire); } catch (ClientException e) { log.debug("Failed to obtain sts."); e.printStackTrace(); } return null; } @Override public URL getObjectUrl(String bucket, String objectKey) { // First check if the object can be fetched. boolean isExist = ossClient.doesObjectExist(bucket, objectKey); if (!isExist) { throw new OSSException("The object does not exist."); } return ossClient.generatePresignedUrl(bucket, objectKey, new Date(System.currentTimeMillis() + OssDockConfiguration.expire * 1000)); } @Override public Boolean deleteObject(String bucket, String objectKey) { if (!ossClient.doesObjectExist(bucket, objectKey)) { return true; } ossClient.deleteObject(bucket, objectKey); return true; } @Override public InputStream getObject(String bucket, String objectKey) { return ossClient.getObject(bucket, objectKey).getObjectContent(); } @Override public void putObject(String bucket, String objectKey, InputStream input) { if (ossClient.doesObjectExist(bucket, objectKey)) { throw new RuntimeException("The filename already exists."); } PutObjectResult objectResult = ossClient.putObject(new PutObjectRequest(bucket, objectKey, input, new ObjectMetadata())); log.info("Upload File: {}", objectResult.getETag()); } @Override public void putObject(String bucket, String objectKey, InputStream input, String contentType) { } @Override public void createClient() { if (Objects.nonNull(this.ossClient)) { return; } this.ossClient = new OSSClientBuilder() .build(OssDockConfiguration.endpoint, OssDockConfiguration.accessKey, OssDockConfiguration.secretKey); } }