storage acl添加,添加contentLength

This commit is contained in:
Jerry Yan 2025-03-01 11:51:00 +08:00
parent 5494352fb0
commit 94bf358a2d
5 changed files with 90 additions and 3 deletions

View File

@ -6,15 +6,18 @@ import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS; import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException; import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.DeleteObjectsRequest; import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.GeneratePresignedUrlRequest; import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.ListObjectsV2Request; import com.aliyun.oss.model.ListObjectsV2Request;
import com.aliyun.oss.model.ListObjectsV2Result; import com.aliyun.oss.model.ListObjectsV2Result;
import com.aliyun.oss.model.OSSObjectSummary; import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.PutObjectRequest; 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.AliOssStorageConfig;
import com.ycwl.basic.storage.entity.StorageConfig; import com.ycwl.basic.storage.entity.StorageConfig;
import com.ycwl.basic.storage.entity.StorageFileObject; 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.StorageConfigException;
import com.ycwl.basic.storage.exceptions.StorageException; import com.ycwl.basic.storage.exceptions.StorageException;
import com.ycwl.basic.storage.exceptions.UploadFileFailedException; import com.ycwl.basic.storage.exceptions.UploadFileFailedException;
@ -68,11 +71,13 @@ final public class AliOssAdapter extends AStorageAdapter {
String fullPath = buildPath(path); String fullPath = buildPath(path);
OSS ossClient = getOssClient(); OSS ossClient = getOssClient();
try { try {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(inputStream.available());
PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream); PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream);
ossClient.putObject(putObjectRequest); ossClient.putObject(putObjectRequest);
return getUrl(path); return getUrl(path);
} catch (ClientException e) { } catch (Exception e) {
throw new UploadFileFailedException("上传文件失败:" + e.getErrorMessage()); throw new UploadFileFailedException("上传文件失败:" + e.getMessage());
} }
} }
@ -174,6 +179,32 @@ final public class AliOssAdapter extends AStorageAdapter {
return true; 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() { private OSS getOssClient() {
OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
return ossClient; return ossClient;

View File

@ -12,6 +12,7 @@ import com.amazonaws.services.s3.model.*;
import com.ycwl.basic.storage.entity.AwsOssStorageConfig; import com.ycwl.basic.storage.entity.AwsOssStorageConfig;
import com.ycwl.basic.storage.entity.StorageConfig; import com.ycwl.basic.storage.entity.StorageConfig;
import com.ycwl.basic.storage.entity.StorageFileObject; 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.StorageConfigException;
import com.ycwl.basic.storage.exceptions.StorageException; import com.ycwl.basic.storage.exceptions.StorageException;
import com.ycwl.basic.storage.exceptions.UploadFileFailedException; import com.ycwl.basic.storage.exceptions.UploadFileFailedException;
@ -65,7 +66,10 @@ public class AwsOssAdapter extends AStorageAdapter {
AmazonS3 s3Client = getS3Client(); AmazonS3 s3Client = getS3Client();
try { try {
ObjectMetadata metadata = new ObjectMetadata(); 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); return getUrl(path);
} catch (Exception e) { } catch (Exception e) {
throw new UploadFileFailedException("上传文件失败:" + e.getMessage()); throw new UploadFileFailedException("上传文件失败:" + e.getMessage());
@ -171,6 +175,32 @@ public class AwsOssAdapter extends AStorageAdapter {
return true; 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() { private AmazonS3Client getS3Client() {
BasicAWSCredentials basicAwsCred = new BasicAWSCredentials(config.getAccessKeyId(), config.getAccessKeySecret()); BasicAWSCredentials basicAwsCred = new BasicAWSCredentials(config.getAccessKeyId(), config.getAccessKeySecret());
ClientConfiguration clientConfiguration = new ClientConfiguration(); ClientConfiguration clientConfiguration = new ClientConfiguration();

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.storage.adapters;
import com.ycwl.basic.storage.entity.StorageConfig; import com.ycwl.basic.storage.entity.StorageConfig;
import com.ycwl.basic.storage.entity.StorageFileObject; import com.ycwl.basic.storage.entity.StorageFileObject;
import com.ycwl.basic.storage.enums.StorageAcl;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
@ -24,4 +25,5 @@ public interface IStorageAdapter {
String getUrlForUpload(Date expireDate, String contentType, String... path); String getUrlForUpload(Date expireDate, String contentType, String... path);
List<StorageFileObject> listDir(String ...path); List<StorageFileObject> listDir(String ...path);
boolean deleteDir(String ...path); boolean deleteDir(String ...path);
boolean setAcl(StorageAcl acl, String ...path);
} }

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.storage.adapters;
import com.ycwl.basic.storage.entity.StorageConfig; import com.ycwl.basic.storage.entity.StorageConfig;
import com.ycwl.basic.storage.entity.StorageFileObject; import com.ycwl.basic.storage.entity.StorageFileObject;
import com.ycwl.basic.storage.enums.StorageAcl;
import java.io.InputStream; import java.io.InputStream;
import java.util.Collections; import java.util.Collections;
@ -54,4 +55,9 @@ public class LocalStorageAdapter extends AStorageAdapter{
public boolean deleteDir(String... path) { public boolean deleteDir(String... path) {
return false; return false;
} }
@Override
public boolean setAcl(StorageAcl acl, String... path) {
return false;
}
} }

View File

@ -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;
}
}