package com.ard.oss.service.impl; import com.amazonaws.HttpMethod; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.PutObjectResult; import com.amazonaws.services.securitytoken.AWSSecurityTokenService; import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder; import com.amazonaws.services.securitytoken.model.AssumeRoleRequest; import com.amazonaws.services.securitytoken.model.AssumeRoleResult; import com.amazonaws.services.securitytoken.model.Credentials; import com.ard.common.config.OssConfiguration; import com.ard.oss.model.CredentialsDTO; import com.ard.oss.model.enums.OssTypeEnum; import com.ard.oss.service.IOssService; 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 1.0 * @date 2022/4/27 */ @Slf4j @Service public class AmazonS3ServiceImpl implements IOssService { private AmazonS3 client; @Override public String getOssType() { return OssTypeEnum.AWS.getType(); } @Override public CredentialsDTO getCredentials() { AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard() .withCredentials(new AWSStaticCredentialsProvider( new BasicAWSCredentials(OssConfiguration.accessKey, OssConfiguration.secretKey))) .withRegion(OssConfiguration.region).build(); AssumeRoleRequest request = new AssumeRoleRequest() .withRoleArn(OssConfiguration.roleArn) .withRoleSessionName(OssConfiguration.roleSessionName) .withDurationSeconds(Math.toIntExact(OssConfiguration.expire)); AssumeRoleResult result = stsClient.assumeRole(request); Credentials credentials = result.getCredentials(); return new CredentialsDTO(credentials); } @Override public URL getObjectUrl(String bucket, String objectKey) { return client.generatePresignedUrl(bucket, objectKey, new Date(System.currentTimeMillis() + OssConfiguration.expire * 1000), HttpMethod.GET); } @Override public Boolean deleteObject(String bucket, String objectKey) { if (!client.doesObjectExist(bucket, objectKey)) { return true; } client.deleteObject(bucket, objectKey); return true; } @Override public InputStream getObject(String bucket, String objectKey) { return client.getObject(bucket, objectKey).getObjectContent().getDelegateStream(); } @Override public void putObject(String bucket, String objectKey, InputStream input) { if (client.doesObjectExist(bucket, objectKey)) { throw new RuntimeException("The filename already exists."); } PutObjectResult objectResult = client.putObject(new PutObjectRequest(bucket, objectKey, input, new ObjectMetadata())); log.info("Upload File: {}", objectResult.toString()); } @Override public void putObject(String bucket, String objectKey, InputStream input, String contentType) { } @Override public void createClient() { if (Objects.nonNull(this.client)) { return; } this.client = AmazonS3ClientBuilder.standard() .withCredentials( new AWSStaticCredentialsProvider( new BasicAWSCredentials(OssConfiguration.accessKey, OssConfiguration.secretKey))) .withRegion(OssConfiguration.region) .build(); } // /** // * Configuring cross-origin resource sharing // */ // @PostConstruct // private void configCORS() { // if (!OssConfiguration.enable || !OssTypeEnum.AWS.getType().equals(OssConfiguration.provider)) { // return; // } // List allowedMethods = new ArrayList<>(); // allowedMethods.add(CORSRule.AllowedMethods.GET); // allowedMethods.add(CORSRule.AllowedMethods.POST); // allowedMethods.add(CORSRule.AllowedMethods.DELETE); // // CORSRule rule = new CORSRule() // .withId("CORSAccessRule") // .withAllowedOrigins(List.of("*")) // .withAllowedHeaders(List.of(AuthInterceptor.PARAM_TOKEN)) // .withAllowedMethods(allowedMethods); // // client.setBucketCrossOriginConfiguration(OssConfiguration.bucket, // new BucketCrossOriginConfiguration().withRules(rule)); // // } }