From 94bf358a2de0ab649d14d5e56e20583eeb34e39d Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Sat, 1 Mar 2025 11:51:00 +0800 Subject: [PATCH] =?UTF-8?q?storage=20acl=E6=B7=BB=E5=8A=A0=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0contentLength?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/storage/adapters/AliOssAdapter.java | 35 +++++++++++++++++-- .../basic/storage/adapters/AwsOssAdapter.java | 32 ++++++++++++++++- .../storage/adapters/IStorageAdapter.java | 2 ++ .../storage/adapters/LocalStorageAdapter.java | 6 ++++ .../ycwl/basic/storage/enums/StorageAcl.java | 18 ++++++++++ 5 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/storage/enums/StorageAcl.java diff --git a/src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java b/src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java index e4290a1..7ee13ac 100644 --- a/src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java +++ b/src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java @@ -6,15 +6,18 @@ import com.aliyun.oss.HttpMethod; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; +import com.aliyun.oss.model.CannedAccessControlList; import com.aliyun.oss.model.DeleteObjectsRequest; import com.aliyun.oss.model.GeneratePresignedUrlRequest; import com.aliyun.oss.model.ListObjectsV2Request; import com.aliyun.oss.model.ListObjectsV2Result; import com.aliyun.oss.model.OSSObjectSummary; import com.aliyun.oss.model.PutObjectRequest; +import com.amazonaws.services.s3.model.ObjectMetadata; import com.ycwl.basic.storage.entity.AliOssStorageConfig; import com.ycwl.basic.storage.entity.StorageConfig; import com.ycwl.basic.storage.entity.StorageFileObject; +import com.ycwl.basic.storage.enums.StorageAcl; import com.ycwl.basic.storage.exceptions.StorageConfigException; import com.ycwl.basic.storage.exceptions.StorageException; import com.ycwl.basic.storage.exceptions.UploadFileFailedException; @@ -68,11 +71,13 @@ final public class AliOssAdapter extends AStorageAdapter { String fullPath = buildPath(path); OSS ossClient = getOssClient(); try { + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(inputStream.available()); PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream); ossClient.putObject(putObjectRequest); return getUrl(path); - } catch (ClientException e) { - throw new UploadFileFailedException("上传文件失败:" + e.getErrorMessage()); + } catch (Exception e) { + throw new UploadFileFailedException("上传文件失败:" + e.getMessage()); } } @@ -174,6 +179,32 @@ final public class AliOssAdapter extends AStorageAdapter { return true; } + private CannedAccessControlList convertAcl(StorageAcl acl) { + switch (acl) { + case PUBLIC_READ: + return CannedAccessControlList.PublicRead; + case PUBLIC_READ_WRITE: + return CannedAccessControlList.PublicReadWrite; + case PRIVATE: + return CannedAccessControlList.Private; + case AUTHENTICATED_READ: + return CannedAccessControlList.AuthenticatedRead; + default: + return CannedAccessControlList.Default; + } + } + + @Override + public boolean setAcl(StorageAcl acl, String... path) { + OSS ossClient = getOssClient(); + try { + ossClient.setObjectAcl(config.getBucketName(), buildPath(path), convertAcl(acl)); + return true; + } catch (OSSException e) { + return false; + } + } + private OSS getOssClient() { OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); return ossClient; diff --git a/src/main/java/com/ycwl/basic/storage/adapters/AwsOssAdapter.java b/src/main/java/com/ycwl/basic/storage/adapters/AwsOssAdapter.java index 7cbbc3b..399f481 100644 --- a/src/main/java/com/ycwl/basic/storage/adapters/AwsOssAdapter.java +++ b/src/main/java/com/ycwl/basic/storage/adapters/AwsOssAdapter.java @@ -12,6 +12,7 @@ import com.amazonaws.services.s3.model.*; import com.ycwl.basic.storage.entity.AwsOssStorageConfig; import com.ycwl.basic.storage.entity.StorageConfig; import com.ycwl.basic.storage.entity.StorageFileObject; +import com.ycwl.basic.storage.enums.StorageAcl; import com.ycwl.basic.storage.exceptions.StorageConfigException; import com.ycwl.basic.storage.exceptions.StorageException; import com.ycwl.basic.storage.exceptions.UploadFileFailedException; @@ -65,7 +66,10 @@ public class AwsOssAdapter extends AStorageAdapter { AmazonS3 s3Client = getS3Client(); try { ObjectMetadata metadata = new ObjectMetadata(); - s3Client.putObject(new PutObjectRequest(config.getBucketName(), fullPath, inputStream, metadata)); + metadata.setContentLength(inputStream.available()); + PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream, metadata); + putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead); // 设置访问权限,让所有用户都允许访问 + s3Client.putObject(putObjectRequest); return getUrl(path); } catch (Exception e) { throw new UploadFileFailedException("上传文件失败:" + e.getMessage()); @@ -171,6 +175,32 @@ public class AwsOssAdapter extends AStorageAdapter { return true; } + private CannedAccessControlList convertAcl(StorageAcl acl) { + switch (acl) { + case PUBLIC_READ: + return CannedAccessControlList.PublicRead; + case PUBLIC_READ_WRITE: + return CannedAccessControlList.PublicReadWrite; + case PRIVATE: + return CannedAccessControlList.Private; + case AUTHENTICATED_READ: + return CannedAccessControlList.AuthenticatedRead; + default: + return CannedAccessControlList.PublicRead; + } + } + + @Override + public boolean setAcl(StorageAcl acl, String... path) { + AmazonS3 s3Client = getS3Client(); + try { + s3Client.setObjectAcl(config.getBucketName(), buildPath(path), convertAcl(acl)); + return true; + } catch (Exception e) { + return false; + } + } + private AmazonS3Client getS3Client() { BasicAWSCredentials basicAwsCred = new BasicAWSCredentials(config.getAccessKeyId(), config.getAccessKeySecret()); ClientConfiguration clientConfiguration = new ClientConfiguration(); diff --git a/src/main/java/com/ycwl/basic/storage/adapters/IStorageAdapter.java b/src/main/java/com/ycwl/basic/storage/adapters/IStorageAdapter.java index 1ccc7e3..c93ae75 100644 --- a/src/main/java/com/ycwl/basic/storage/adapters/IStorageAdapter.java +++ b/src/main/java/com/ycwl/basic/storage/adapters/IStorageAdapter.java @@ -2,6 +2,7 @@ package com.ycwl.basic.storage.adapters; import com.ycwl.basic.storage.entity.StorageConfig; import com.ycwl.basic.storage.entity.StorageFileObject; +import com.ycwl.basic.storage.enums.StorageAcl; import org.springframework.web.multipart.MultipartFile; import java.io.File; @@ -24,4 +25,5 @@ public interface IStorageAdapter { String getUrlForUpload(Date expireDate, String contentType, String... path); List listDir(String ...path); boolean deleteDir(String ...path); + boolean setAcl(StorageAcl acl, String ...path); } diff --git a/src/main/java/com/ycwl/basic/storage/adapters/LocalStorageAdapter.java b/src/main/java/com/ycwl/basic/storage/adapters/LocalStorageAdapter.java index 6f95d8c..f1fe09d 100644 --- a/src/main/java/com/ycwl/basic/storage/adapters/LocalStorageAdapter.java +++ b/src/main/java/com/ycwl/basic/storage/adapters/LocalStorageAdapter.java @@ -2,6 +2,7 @@ package com.ycwl.basic.storage.adapters; import com.ycwl.basic.storage.entity.StorageConfig; import com.ycwl.basic.storage.entity.StorageFileObject; +import com.ycwl.basic.storage.enums.StorageAcl; import java.io.InputStream; import java.util.Collections; @@ -54,4 +55,9 @@ public class LocalStorageAdapter extends AStorageAdapter{ public boolean deleteDir(String... path) { return false; } + + @Override + public boolean setAcl(StorageAcl acl, String... path) { + return false; + } } diff --git a/src/main/java/com/ycwl/basic/storage/enums/StorageAcl.java b/src/main/java/com/ycwl/basic/storage/enums/StorageAcl.java new file mode 100644 index 0000000..64c23ba --- /dev/null +++ b/src/main/java/com/ycwl/basic/storage/enums/StorageAcl.java @@ -0,0 +1,18 @@ +package com.ycwl.basic.storage.enums; + +public enum StorageAcl { + PUBLIC_READ("public-read"), + PRIVATE("private"), + PUBLIC_READ_WRITE("public-read-write"), + AUTHENTICATED_READ("authenticated-read"); + + private final String value; + + StorageAcl(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +}