[OSS]文件服务插件

This commit is contained in:
tanfengling@x-ri.com 2025-12-08 14:43:43 +08:00
parent 4f20f20b6c
commit 7779d70647
1 changed files with 279 additions and 0 deletions

View File

@ -0,0 +1,279 @@
package tqq9.lc123.cloud.app.fileserver;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import kd.bos.filestorage.s3.util.URLUtils;
import kd.bos.filestorage.spi.FileStorageConfig;
import kd.bos.filestorage.spi.FileStorageService;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import tqq9.lc123.cloud.app.plugin.utils.ConfigUtils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
/**
* 阿里云OSS文件服务扩展
*/
public class OSSFileStorageServiceExt implements FileStorageService {
private static final Log log = LogFactory.getLog(OSSFileStorageServiceExt.class);
private OSS ossClient;
private String endPoint = ConfigUtils.getThirdConfigByNumber("ALI_OSS_EndPoint");
private String accessKeyId = ConfigUtils.getThirdConfigByNumber("ALI_OSS_AccessKey_ID");
private String accessKeySecret = ConfigUtils.getThirdConfigByNumber("ALI_OSS_AccessKey_Secret");
//目录名称
private String directory = ConfigUtils.getThirdConfigByNumber("ALI_OSS_Directory");
//存储空间名称
private String bucketName = ConfigUtils.getThirdConfigByNumber("ALI_OSS_BucketName");
//地域
private String region = ConfigUtils.getThirdConfigByNumber("ALI_OSS_Region");
@Override
public void setConfig(FileStorageConfig fileStorageConfig) {
ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
}
@Override
public List<String> getForbiddenExtensions() throws Exception {
return null;
}
@Override
public String getTicket() throws Exception {
return null;
}
@Override
public String upload(InputStream inputStream, String filePath, String fileName, boolean isCreateNewFileWhenExists, Map<String, String> headers) throws Exception {
// Endpoint以华东1杭州为例其它Region请按实际情况填写
//String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证运行本代码示例之前请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称例如examplebucket
// String bucketName = "examplebucket";
// 填写Object完整路径完整路径中不能包含Bucket名称例如exampledir/exampleobject.txt
String objectName = directory + "/" + fileName;
// 填写本地文件的完整路径例如D:\\localpath\\examplefile.txt
// 如果未指定本地路径则默认从示例程序所属项目对应本地路径中上传文件
// String filePath= "D:\\localpath\\examplefile.txt";
// 填写Bucket所在地域以华东1杭州为例Region填写为cn-hangzhou
// String region = "cn-hangzhou";
// 创建OSSClient实例
// 当OSSClient实例不再使用时调用shutdown方法以释放资源
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endPoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 创建PutObjectRequest对象
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
// 如果需要上传时设置存储类型和访问权限请参考以下示例代码
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上传文件
PutObjectResult result = ossClient.putObject(putObjectRequest);
} 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());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return null;
}
@Override
public InputStream getInputStream(String fullFilePath, String userAgent) throws Exception {
URLUtils.ValidUrl validUrl = URLUtils.getValidUrl(fullFilePath);
return ossClient.getObject(bucketName, validUrl.getFilePath()).getObjectContent();
}
@Override
public void download(String fullFilePath, OutputStream outputStream, String userAgent) throws Exception {
// Endpoint以华东1杭州为例其它Region请按实际情况填写
// String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
//从环境变量中获取访问凭证运行本代码示例之前请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称例如examplebucket
// String bucketName = "examplebucket";
// 填写不包含Bucket名称在内的Object完整路径例如testfolder/exampleobject.txt
File file = new File(fullFilePath);
String fileName = file.getName();
String objectName = directory + "/" + fileName;
// 填写Object下载到本地的完整路径
// String pathName = "D:\\localpath\\examplefile.txt";
// 填写Bucket所在地域以华东1杭州为例Region填写为cn-hangzhou
// String region = "cn-hangzhou";
// 创建OSSClient实例
// 当OSSClient实例不再使用时调用shutdown方法以释放资源
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endPoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 下载Object到本地文件并保存到指定的本地路径中如果指定的本地文件存在会覆盖不存在则新建
// 如果未指定本地路径则下载后的文件默认保存到示例程序所属项目对应本地路径中
// ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(fullFilePath));
} 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());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
@Override
public void delete(String fullFilePath) throws Exception {
// Endpoint以华东1杭州为例其它Region请按实际情况填写
// String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证运行本代码示例之前请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称例如examplebucket
// String bucketName = "examplebucket";
// 填写文件完整路径文件完整路径中不能包含Bucket名称
// String objectName = "exampleobject.txt";
File file = new File(fullFilePath);
String objectName = file.getName();
// 填写Bucket所在地域以华东1杭州为例Region填写为cn-hangzhou
// String region = "cn-hangzhou";
// 创建OSSClient实例
// 当OSSClient实例不再使用时调用shutdown方法以释放资源
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endPoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 删除文件或目录如果要删除目录目录必须为空
ossClient.deleteObject(bucketName, objectName);
} 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());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
@Override
public boolean exists(String fullFilePath) throws Exception {
// Endpoint以华东1杭州为例其它Region请按实际情况填写
// String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证运行本代码示例之前请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称例如examplebucket
// String bucketName = "examplebucket";
// 填写不包含Bucket名称在内的Object完整路径例如exampleobject.txt
// String objectName = "exampleobject.txt";
File file = new File(fullFilePath);
String objectName = file.getName();
// 填写Bucket所在地域以华东1杭州为例Region填写为cn-hangzhou
// String region = "cn-hangzhou";
// 创建OSSClient实例
// 当OSSClient实例不再使用时调用shutdown方法以释放资源
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endPoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 判断文件是否存在如果返回值为true则文件存在否则存储空间或者文件不存在
// 设置是否进行重定向或者镜像回源默认值为true表示忽略302重定向和镜像回源如果设置isINoss为false则进行302重定向或者镜像回源
//boolean isINoss = true;
boolean found = ossClient.doesObjectExist(bucketName, objectName);
//boolean found = ossClient.doesObjectExist(bucketName, objectName, isINoss);
System.out.println(found);
} 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());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return false;
}
@Override
public void close() throws IOException {
if(ossClient != null){
ossClient.shutdown();
}
}
}