diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/JinShanOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/JinShanOssClient.java new file mode 100644 index 0000000..6bb971f --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/JinShanOssClient.java @@ -0,0 +1,309 @@ +package com.schisandra.oss.application.oss.core.jinshan; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.ksyun.ks3.dto.*; +import com.ksyun.ks3.service.Ks3; +import com.ksyun.ks3.service.request.CompleteMultipartUploadRequest; +import com.ksyun.ks3.service.request.GetObjectRequest; +import com.ksyun.ks3.service.request.InitiateMultipartUploadRequest; +import com.ksyun.ks3.service.request.UploadPartRequest; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.jinshan.model.JinShanOssConfig; +import com.schisandra.oss.application.oss.model.DirectoryOssInfo; +import com.schisandra.oss.application.oss.model.FileOssInfo; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; +import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; +import com.schisandra.oss.application.oss.model.upload.*; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @description: jinshan oss client + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:01 + */ +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +public class JinShanOssClient implements StandardOssClient { + + public static final String KS3_OBJECT_NAME = "ks3"; + + private Ks3 ks3; + private JinShanOssConfig jinShanOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + String bucket = getBucket(); + String key = getKey(targetName, false); + if (isOverride || !ks3.objectExists(bucket, key)) { + ks3.putObject(bucket, key, is, null); + } + return getInfo(targetName); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + return uploadFile(file, targetName, jinShanOssConfig.getSliceConfig(), OssConstant.OssType.JINSHAN); + } + + @Override + public void completeUpload(UpLoadCheckPoint upLoadCheckPoint, List partEntityTags) { + List eTags = partEntityTags.stream().sorted(Comparator.comparingInt(UpLoadPartEntityTag::getPartNumber)) + .map(partEntityTag -> { + PartETag p = new PartETag(); + p.seteTag(partEntityTag.getETag()); + p.setPartNumber(partEntityTag.getPartNumber()); + return p; + }).collect(Collectors.toList()); + + CompleteMultipartUploadRequest completeMultipartUploadRequest = + new CompleteMultipartUploadRequest(upLoadCheckPoint.getBucket(), upLoadCheckPoint.getKey(), upLoadCheckPoint.getUploadId(), eTags); + ks3.completeMultipartUpload(completeMultipartUploadRequest); + FileUtil.del(upLoadCheckPoint.getCheckpointFile()); + } + + @Override + public void prepareUpload(UpLoadCheckPoint uploadCheckPoint, File upLoadFile, String targetName, String checkpointFile, SliceConfig slice) { + String bucket = getBucket(); + String key = getKey(targetName, false); + + uploadCheckPoint.setMagic(UpLoadCheckPoint.UPLOAD_MAGIC); + uploadCheckPoint.setUploadFile(upLoadFile.getPath()); + uploadCheckPoint.setKey(key); + uploadCheckPoint.setBucket(bucket); + uploadCheckPoint.setCheckpointFile(checkpointFile); + uploadCheckPoint.setUploadFileStat(UpLoadFileStat.getFileStat(uploadCheckPoint.getUploadFile())); + + long partSize = slice.getPartSize(); + long fileLength = upLoadFile.length(); + int parts = (int) (fileLength / partSize); + if (fileLength % partSize > 0) { + parts++; + } + + uploadCheckPoint.setUploadParts(splitUploadFile(uploadCheckPoint.getUploadFileStat().getSize(), partSize)); + uploadCheckPoint.setPartEntityTags(new ArrayList<>()); + uploadCheckPoint.setOriginPartSize(parts); + + InitiateMultipartUploadResult initiateMultipartUploadResult = + ks3.initiateMultipartUpload(new InitiateMultipartUploadRequest(bucket, key)); + + uploadCheckPoint.setUploadId(initiateMultipartUploadResult.getUploadId()); + } + + @Override + public UpLoadPartResult uploadPart(UpLoadCheckPoint upLoadCheckPoint, int partNum, InputStream inputStream) { + UploadPart uploadPart = upLoadCheckPoint.getUploadParts().get(partNum); + long partSize = uploadPart.getSize(); + UpLoadPartResult partResult = new UpLoadPartResult(partNum + 1, uploadPart.getOffset(), partSize); + + try { + inputStream.skip(uploadPart.getOffset()); + + UploadPartRequest uploadPartRequest = new UploadPartRequest(upLoadCheckPoint.getBucket(), upLoadCheckPoint.getKey()); + uploadPartRequest.setUploadId(upLoadCheckPoint.getUploadId()); + uploadPartRequest.setInputStream(inputStream); + uploadPartRequest.setPartSize(partSize); + uploadPartRequest.setPartNumber(partNum + 1); + PartETag eTag = ks3.uploadPart(uploadPartRequest); + + partResult.setNumber(eTag.getPartNumber()); + partResult.setEntityTag(new UpLoadPartEntityTag().setETag(eTag.geteTag()).setPartNumber(eTag.getPartNumber())); + } catch (Exception e) { + partResult.setFailed(true); + partResult.setException(e); + } finally { + IoUtil.close(inputStream); + } + + return partResult; + } + + @Override + public void downLoad(OutputStream os, String targetName) { + GetObjectResult objectResult = ks3.getObject(getBucket(), getKey(targetName, false)); + IoUtil.copy(objectResult.getObject().getObjectContent(), os); + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + downLoadFile(localFile, targetName, jinShanOssConfig.getSliceConfig(), OssConstant.OssType.JINSHAN); + } + + @Override + public DownloadObjectStat getDownloadObjectStat(String targetName) { + GetObjectResult objectResult = ks3.getObject(getBucket(), getKey(targetName, false)); + ObjectMetadata objectMetadata = objectResult.getObject().getObjectMetadata(); + DateTime date = DateUtil.date(objectMetadata.getLastModified()); + long contentLength = objectMetadata.getContentLength(); + String eTag = objectMetadata.getETag(); + return new DownloadObjectStat().setSize(contentLength).setLastModified(date).setDigest(eTag); + } + + @Override + public void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { + downloadCheckPoint.setMagic(DownloadCheckPoint.DOWNLOAD_MAGIC); + downloadCheckPoint.setDownloadFile(localFile.getPath()); + downloadCheckPoint.setBucketName(getBucket()); + downloadCheckPoint.setKey(getKey(targetName, false)); + downloadCheckPoint.setCheckPointFile(checkpointFile); + + downloadCheckPoint.setObjectStat(getDownloadObjectStat(targetName)); + + long downloadSize; + if (downloadCheckPoint.getObjectStat().getSize() > 0) { + Long partSize = jinShanOssConfig.getSliceConfig().getPartSize(); + long[] slice = getDownloadSlice(new long[0], downloadCheckPoint.getObjectStat().getSize()); + downloadCheckPoint.setDownloadParts(splitDownloadFile(slice[0], slice[1], partSize)); + downloadSize = slice[1]; + } else { + downloadSize = 0; + downloadCheckPoint.setDownloadParts(splitDownloadOneFile()); + } + downloadCheckPoint.setOriginPartSize(downloadCheckPoint.getDownloadParts().size()); + createDownloadTemp(downloadCheckPoint.getTempDownloadFile(), downloadSize); + } + + @Override + public InputStream downloadPart(String key, long start, long end) { + GetObjectRequest request = new GetObjectRequest(getBucket(), key); + request.setRange(start, end); + GetObjectResult object = ks3.getObject(request); + return object.getObject().getObjectContent(); + } + + @Override + public void delete(String targetName) { + ks3.deleteObject(getBucket(), getKey(targetName, false)); + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + String bucket = getBucket(); + String newTargetName = getKey(targetName, false); + if (isOverride || !ks3.objectExists(bucket, newTargetName)) { + ks3.copyObject(bucket, newTargetName, bucket, getKey(sourceName, false)); + } + } + + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + String key = getKey(targetName, false); + + OssInfo ossInfo = getBaseInfo(key); + ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); + ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); + + if (isRecursion && isDirectory(key)) { + String prefix = OssPathUtil.convertPath(key, false); + ObjectListing listObjects = ks3.listObjects(getBucket(), prefix.endsWith(StrUtil.SLASH) ? prefix : prefix + StrUtil.SLASH); + + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(listObjects.getObjectSummaries())) { + for (Ks3ObjectSummary ks3ObjectSummary : listObjects.getObjectSummaries()) { + if (FileNameUtil.getName(ks3ObjectSummary.getKey()).equals(FileNameUtil.getName(key))) { + ossInfo.setLastUpdateTime(DateUtil.date(ks3ObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(ks3ObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(ks3ObjectSummary.getSize())); + } else { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(ks3ObjectSummary.getKey(), getBasePath(), false), false)); + } + } + } + + if (ObjectUtil.isNotEmpty(listObjects.getCommonPrefixes())) { + for (String commonPrefix : listObjects.getCommonPrefixes()) { + String target = OssPathUtil.replaceKey(commonPrefix, getBasePath(), false); + if (isDirectory(commonPrefix)) { + directoryInfos.add(getInfo(target, true)); + } else { + fileOssInfos.add(getInfo(target, false)); + } + } + } + if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + } + if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + } + + return ossInfo; + } + + @Override + public Boolean isExist(String targetName) { + return ks3.objectExists(getBucket(), getKey(targetName, false)); + } + + @Override + public String getBasePath() { + return jinShanOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(KS3_OBJECT_NAME, getKs3()); + } + }; + } + + private String getBucket() { + String bucketName = jinShanOssConfig.getBucketName(); + if (!ks3.bucketExists(bucketName)) { + ks3.createBucket(bucketName); + } + return bucketName; + } + + public OssInfo getBaseInfo(String key) { + OssInfo ossInfo; + + if (isFile(key)) { + ossInfo = new FileOssInfo(); + try { + GetObjectResult objectResult = ks3.getObject(getBucket(), key); + ObjectMetadata objectMetadata = objectResult.getObject().getObjectMetadata(); + ossInfo.setLastUpdateTime(DateUtil.date(objectMetadata.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(objectMetadata.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(objectMetadata.getContentLength())); + } catch (Exception e) { + log.error("获取{}文件属性失败", key, e); + } + } else { + ossInfo = new DirectoryOssInfo(); + } + return ossInfo; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/JinShanOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/JinShanOssConfiguration.java new file mode 100644 index 0000000..0f593f8 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/JinShanOssConfiguration.java @@ -0,0 +1,91 @@ +package com.schisandra.oss.application.oss.core.jinshan; + +import cn.hutool.core.text.CharPool; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.ksyun.ks3.http.Region; +import com.ksyun.ks3.service.Ks3; +import com.ksyun.ks3.service.Ks3Client; + +import com.schisandra.oss.application.convert.SchisandraOssJdDTOConverter; +import com.schisandra.oss.application.convert.SchisandraOssJinshanDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssJinshanDTO; +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.jd.model.JdOssConfig; +import com.schisandra.oss.application.oss.core.jinshan.model.JinShanOssClientConfig; +import com.schisandra.oss.application.oss.core.jinshan.model.JinShanOssConfig; +import com.schisandra.oss.application.oss.core.jinshan.model.Ks3ClientConfig; +import com.schisandra.oss.domain.bo.SchisandraOssJdBO; +import com.schisandra.oss.domain.bo.SchisandraOssJinshanBO; +import com.schisandra.oss.domain.service.SchisandraOssJinshanDomainService; +import com.schisandra.oss.infra.basic.dao.SchisandraOssJinshanDao; +import com.schisandra.oss.infra.basic.entity.SchisandraOssJinshan; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.Optional; + +/** + * @description:jinshan oss配置信息 + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 11:26 + */ +@Component +@Slf4j +public class JinShanOssConfiguration { + + @Resource + private SchisandraOssJinshanDomainService schisandraOssJinshanDomainService; + + + public StandardOssClient jinShanOssClient(String userId) { + SchisandraOssJinshanBO schisandraOssJinshan=schisandraOssJinshanDomainService.getJinshanOssConfig(userId); + SchisandraOssJinshanDTO schisandraOssJinshanDTO= SchisandraOssJinshanDTOConverter.INSTANCE.convertBOToDTO(schisandraOssJinshan); + if (ObjectUtil.isEmpty(schisandraOssJinshanDTO)) { + log.error("jinshan oss配置信息获取失败"); + return null; + } + String accessKeyId = schisandraOssJinshanDTO.getAccessKeyId(); + String accessKeySecret = schisandraOssJinshanDTO.getAccessKeySecret(); + String endpoint = schisandraOssJinshanDTO.getEndpoint(); + Region region = Region.valueOf(schisandraOssJinshanDTO.getRegion()); + String securityToken = schisandraOssJinshanDTO.getSecurityToken(); + JinShanOssConfig jinshanConfig = new JinShanOssConfig(); + jinshanConfig.setAccessKeyId(accessKeyId); + jinshanConfig.setAccessKeySecret(accessKeySecret); + jinshanConfig.setEndpoint(endpoint); + jinshanConfig.setRegion(region); + jinshanConfig.setSecurityToken(securityToken); + return jinShanOssClient(jinshanConfig); + } + + public StandardOssClient jinShanOssClient(JinShanOssConfig jinShanOssConfig) { + return new JinShanOssClient(ks3(jinShanOssConfig), jinShanOssConfig); + } + + public Ks3 ks3(JinShanOssConfig ossConfig) { + JinShanOssClientConfig jinShanOssClientConfig = Optional.ofNullable(ossConfig.getClientConfig()).orElse(new JinShanOssClientConfig()); + + Ks3ClientConfig clientConfig = jinShanOssClientConfig.toClientConfig(); + clientConfig.setHttpClientConfig(jinShanOssClientConfig.toHttpClientConfig()); + clientConfig.setEndpoint(ossConfig.getEndpoint()); + clientConfig.setRegion(ossConfig.getRegion()); + + if (ObjectUtil.isNotEmpty(ossConfig.getSecurityToken())) { + return new Ks3Client(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret(), ossConfig.getSecurityToken(), clientConfig); + } else { + return new Ks3Client(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret(), clientConfig); + } + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/JinShanOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/JinShanOssClientConfig.java new file mode 100644 index 0000000..d1ad143 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/JinShanOssClientConfig.java @@ -0,0 +1,55 @@ +package com.schisandra.oss.application.oss.core.jinshan.model; + +import cn.hutool.core.bean.BeanUtil; +import com.ksyun.ks3.http.HttpClientConfig; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +@Data +@EqualsAndHashCode(callSuper = true) +public class JinShanOssClientConfig extends HttpClientConfig { + /** + * http或者https + */ + private Ks3ClientConfig.PROTOCOL protocol = Ks3ClientConfig.PROTOCOL.http; + /** + * 签名版本 + */ + private Ks3ClientConfig.SignerVersion version = Ks3ClientConfig.SignerVersion.V2; + /** + * 是否使用path style access方式访问 + */ + private boolean pathStyleAccess = false; + /** + * 允许客户端发送匿名请求 + */ + private boolean allowAnonymous = true; + /** + * 当服务端返回307时是否自动跳转, + * 主要发生在用Region A的endpoint请求Region B的endpoint + */ + private boolean flowRedirect = true; + /** + * 是否使用绑定的域名作为endpoint + */ + private boolean domainMode = false; + /** + * 签名类 + */ + private String signerClass = "com.ksyun.ks3.signer.DefaultSigner"; + private boolean useGzip = false; + + public Ks3ClientConfig toClientConfig() { + Ks3ClientConfig clientConfig = new Ks3ClientConfig(); + BeanUtil.copyProperties(this, clientConfig); + return clientConfig; + } + + public HttpClientConfig toHttpClientConfig() { + HttpClientConfig httpClientConfig = new HttpClientConfig(); + BeanUtil.copyProperties(this, httpClientConfig); + return httpClientConfig; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/JinShanOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/JinShanOssConfig.java new file mode 100644 index 0000000..7870483 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/JinShanOssConfig.java @@ -0,0 +1,40 @@ +package com.schisandra.oss.application.oss.core.jinshan.model; + +import com.ksyun.ks3.http.Region; + +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; + +@Data +public class JinShanOssConfig { + private String accessKeyId; + private String accessKeySecret; + private String bucketName; + private String endpoint; + /** + * 服务地址,参考{@linkplain http://ks3.ksyun.com/doc/api/index.html Doc}
+ * 中国(杭州):kss.ksyun.com
+ * 中国(杭州)cdn:kssws.ks-cdn.com
+ * 美国(圣克拉拉):ks3-us-west-1.ksyun.com
+ * 中国(北京):ks3-cn-beijing.ksyun.com
+ * 中国(香港):ks3-cn-hk-1.ksyun.com
+ * 中国(上海):ks3-cn-shanghai.ksyun.com
+ */ + private Region region = null; + private String securityToken; + private String basePath; + + private JinShanOssClientConfig clientConfig; + + /** + * 断点续传参数 + */ + private SliceConfig sliceConfig = new SliceConfig(); + + public void init() { + this.sliceConfig.init(); + basePath = OssPathUtil.valid(basePath); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/Ks3ClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/Ks3ClientConfig.java new file mode 100644 index 0000000..ed9d5aa --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/jinshan/model/Ks3ClientConfig.java @@ -0,0 +1,17 @@ +package com.schisandra.oss.application.oss.core.jinshan.model; + + +public class Ks3ClientConfig extends com.ksyun.ks3.service.Ks3ClientConfig { + + private SignerVersion version = SignerVersion.V2; + + @Override + public SignerVersion getVersion() { + return version; + } + + @Override + public void setVersion(SignerVersion version) { + this.version = version; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/QingYunOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/QingYunOssClient.java new file mode 100644 index 0000000..b718995 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/QingYunOssClient.java @@ -0,0 +1,369 @@ +package com.schisandra.oss.application.oss.core.qingyun; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.qingstor.sdk.exception.QSException; +import com.qingstor.sdk.service.Bucket; +import com.qingstor.sdk.service.QingStor; +import com.qingstor.sdk.service.Types; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.qingyun.model.QingYunOssConfig; +import com.schisandra.oss.application.oss.exception.OssException; +import com.schisandra.oss.application.oss.model.DirectoryOssInfo; +import com.schisandra.oss.application.oss.model.FileOssInfo; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; +import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; +import com.schisandra.oss.application.oss.model.upload.*; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.*; +/** + * @description: qingyun oss client + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:02 + */ + +@Data +@Slf4j +@AllArgsConstructor +@NoArgsConstructor +public class QingYunOssClient implements StandardOssClient { + + public static final String QINGSTORE_OBJECT_NAME = "qingStor"; + public static final String BUCKET_OBJECT_NAME = "bucketClient"; + + private QingStor qingStor; + private Bucket bucketClient; + private QingYunOssConfig qingYunOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + String key = getKey(targetName, false); + if (isOverride || !isExist(targetName)) { + Bucket.PutObjectInput input = new Bucket.PutObjectInput(); + input.setBodyInputStream(is); + try { + bucketClient.putObject(key, input); + } catch (Exception e) { + throw new OssException(e); + } + } + return getInfo(targetName); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + return uploadFile(file, targetName, qingYunOssConfig.getSliceConfig(), OssConstant.OssType.QINGYUN); + } + + @Override + public void completeUpload(UpLoadCheckPoint upLoadCheckPoint, List partEntityTags) { + try { + String uploadId = upLoadCheckPoint.getUploadId(); + String key = upLoadCheckPoint.getKey(); + + Bucket.ListMultipartInput listMultipartInput = new Bucket.ListMultipartInput(); + listMultipartInput.setUploadID(uploadId); + Bucket.ListMultipartOutput output = bucketClient.listMultipart(key, listMultipartInput); + List objectParts = output.getObjectParts(); + + Bucket.CompleteMultipartUploadInput multipartUploadInput = new Bucket.CompleteMultipartUploadInput(); + multipartUploadInput.setUploadID(uploadId); + multipartUploadInput.setObjectParts(objectParts); + + bucketClient.completeMultipartUpload(key, multipartUploadInput); + FileUtil.del(upLoadCheckPoint.getCheckpointFile()); + } catch (QSException e) { + throw new OssException(e); + } + } + + @Override + public void prepareUpload(UpLoadCheckPoint uploadCheckPoint, File upLoadFile, String targetName, String checkpointFile, SliceConfig slice) { + String bucket = getBucket(); + String key = getKey(targetName, false); + + uploadCheckPoint.setMagic(UpLoadCheckPoint.UPLOAD_MAGIC); + uploadCheckPoint.setUploadFile(upLoadFile.getPath()); + uploadCheckPoint.setKey(key); + uploadCheckPoint.setBucket(bucket); + uploadCheckPoint.setCheckpointFile(checkpointFile); + uploadCheckPoint.setUploadFileStat(UpLoadFileStat.getFileStat(uploadCheckPoint.getUploadFile())); + + long partSize = slice.getPartSize(); + long fileLength = upLoadFile.length(); + int parts = (int) (fileLength / partSize); + if (fileLength % partSize > 0) { + parts++; + } + + uploadCheckPoint.setUploadParts(splitUploadFile(uploadCheckPoint.getUploadFileStat().getSize(), partSize)); + uploadCheckPoint.setPartEntityTags(new ArrayList<>()); + uploadCheckPoint.setOriginPartSize(parts); + + try { + Bucket.InitiateMultipartUploadInput input = new Bucket.InitiateMultipartUploadInput(); + Bucket.InitiateMultipartUploadOutput multipartUploadOutput = bucketClient.initiateMultipartUpload(key, input); + uploadCheckPoint.setUploadId(multipartUploadOutput.getUploadID()); + } catch (QSException e) { + throw new OssException(e); + } + + } + + @Override + public UpLoadPartResult uploadPart(UpLoadCheckPoint upLoadCheckPoint, int partNum, InputStream inputStream) { + UploadPart uploadPart = upLoadCheckPoint.getUploadParts().get(partNum); + long partSize = uploadPart.getSize(); + UpLoadPartResult partResult = new UpLoadPartResult(partNum + 1, uploadPart.getOffset(), partSize); + + try { + inputStream.skip(uploadPart.getOffset()); + + Bucket.UploadMultipartInput input = new Bucket.UploadMultipartInput(); + input.setPartNumber(partNum + 1); + input.setFileOffset(uploadPart.getOffset()); + input.setUploadID(upLoadCheckPoint.getUploadId()); + input.setBodyInputStream(inputStream); + Bucket.UploadMultipartOutput multipartOutput = bucketClient.uploadMultipart(upLoadCheckPoint.getKey(), input); + + partResult.setNumber(partNum + 1); + partResult.setEntityTag(new UpLoadPartEntityTag().setETag(multipartOutput.getETag()).setPartNumber(partNum)); + } catch (Exception e) { + partResult.setFailed(true); + partResult.setException(e); + } finally { + IoUtil.close(inputStream); + } + + return partResult; + } + + @Override + public void downLoad(OutputStream os, String targetName) { + try { + Bucket.GetObjectInput input = new Bucket.GetObjectInput(); + Bucket.GetObjectOutput object = bucketClient.getObject(getKey(targetName, false), input); + IoUtil.copy(object.getBodyInputStream(), os); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + downLoadFile(localFile, targetName, qingYunOssConfig.getSliceConfig(), OssConstant.OssType.QINGYUN); + } + + @Override + public DownloadObjectStat getDownloadObjectStat(String targetName) { + try { + Bucket.GetObjectInput input = new Bucket.GetObjectInput(); + Bucket.GetObjectOutput object = bucketClient.getObject(getKey(targetName, false), input); + DateTime date = DateUtil.date(Date.parse(object.getLastModified())); + long contentLength = object.getContentLength(); + String eTag = object.getETag(); + return new DownloadObjectStat().setSize(contentLength).setLastModified(date).setDigest(eTag); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { + downloadCheckPoint.setMagic(DownloadCheckPoint.DOWNLOAD_MAGIC); + downloadCheckPoint.setDownloadFile(localFile.getPath()); + downloadCheckPoint.setBucketName(getBucket()); + downloadCheckPoint.setKey(getKey(targetName, false)); + downloadCheckPoint.setCheckPointFile(checkpointFile); + + downloadCheckPoint.setObjectStat(getDownloadObjectStat(targetName)); + + long downloadSize; + if (downloadCheckPoint.getObjectStat().getSize() > 0) { + Long partSize = qingYunOssConfig.getSliceConfig().getPartSize(); + long[] slice = getDownloadSlice(new long[0], downloadCheckPoint.getObjectStat().getSize()); + downloadCheckPoint.setDownloadParts(splitDownloadFile(slice[0], slice[1], partSize)); + downloadSize = slice[1]; + } else { + downloadSize = 0; + downloadCheckPoint.setDownloadParts(splitDownloadOneFile()); + } + downloadCheckPoint.setOriginPartSize(downloadCheckPoint.getDownloadParts().size()); + createDownloadTemp(downloadCheckPoint.getTempDownloadFile(), downloadSize); + } + + @Override + public InputStream downloadPart(String key, long start, long end) { + try { + Bucket.GetObjectInput putObjectInput = new Bucket.GetObjectInput(); + putObjectInput.setRange("bytes=" + start + "-" + end); + Bucket.GetObjectOutput object = bucketClient.getObject(key, putObjectInput); + return object.getBodyInputStream(); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void delete(String targetName) { + try { + bucketClient.deleteObject(getKey(targetName, false)); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + String bucket = getBucket(); + String newSourceName = getKey(sourceName, false); + String newTargetName = getKey(targetName, false); + if (isOverride || !isExist(targetName)) { + try { + Bucket.PutObjectInput input = new Bucket.PutObjectInput(); + input.setXQSCopySource(StrUtil.SLASH + bucket + StrUtil.SLASH + newSourceName); + bucketClient.putObject(newTargetName, input); + } catch (Exception e) { + throw new OssException(e); + } + } + } + + @Override + public void move(String sourceName, String targetName, Boolean isOverride) { + String bucket = getBucket(); + String newSourceName = getKey(sourceName, false); + String newTargetName = getKey(targetName, false); + if (isOverride || !isExist(targetName)) { + try { + Bucket.PutObjectInput input = new Bucket.PutObjectInput(); + input.setXQSMoveSource(StrUtil.SLASH + bucket + StrUtil.SLASH + newSourceName); + bucketClient.putObject(newTargetName, input); + } catch (Exception e) { + throw new OssException(e); + } + } + } + + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + String key = getKey(targetName, false); + + OssInfo ossInfo = getBaseInfo(key); + ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); + ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); + + if (isRecursion && isDirectory(key)) { + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + + try { + String prefix = OssPathUtil.convertPath(key, false); + Bucket.ListObjectsInput input = new Bucket.ListObjectsInput(); + input.setPrefix(prefix.endsWith(StrUtil.SLASH) ? prefix : prefix + StrUtil.SLASH); + input.setDelimiter(StrUtil.SLASH); + Bucket.ListObjectsOutput listObjects = bucketClient.listObjects(input); + + if (ObjectUtil.isNotEmpty(listObjects.getKeys())) { + for (Types.KeyModel keyModel : listObjects.getKeys()) { + if (FileNameUtil.getName(keyModel.getKey()).equals(FileNameUtil.getName(key))) { + ossInfo.setLastUpdateTime(DateUtil.parse(keyModel.getCreated()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.parse(keyModel.getCreated()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(keyModel.getSize())); + } else { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(keyModel.getKey(), getBasePath(), false), false)); + } + } + } + + if (ObjectUtil.isNotEmpty(listObjects.getCommonPrefixes())) { + for (String commonPrefix : listObjects.getCommonPrefixes()) { + String target = OssPathUtil.replaceKey(commonPrefix, getBasePath(), false); + if (isDirectory(commonPrefix)) { + directoryInfos.add(getInfo(target, true)); + } else { + fileOssInfos.add(getInfo(target, false)); + } + } + } + } catch (Exception e) { + throw new OssException(e); + } + if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + } + if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + } + + return ossInfo; + } + + @Override + public Boolean isExist(String targetName) { + OssInfo info = getInfo(targetName); + return ObjectUtil.isNotEmpty(info.getLength()) && Convert.toLong(info.getLength()) > 0; + } + + @Override + public String getBasePath() { + return qingYunOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(QINGSTORE_OBJECT_NAME, getQingStor()); + put(BUCKET_OBJECT_NAME, getBucketClient()); + } + }; + } + + private String getBucket() { + return qingYunOssConfig.getBucketName(); + } + + public OssInfo getBaseInfo(String key) { + OssInfo ossInfo; + + if (isFile(key)) { + ossInfo = new FileOssInfo(); + try { + Bucket.GetObjectOutput object = bucketClient.getObject(key, new Bucket.GetObjectInput()); + ossInfo.setLastUpdateTime(DateUtil.date(Date.parse(object.getLastModified())).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(Date.parse(object.getLastModified())).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(object.getContentLength())); + } catch (Exception e) { + log.error("获取{}文件属性失败", key, e); + } + } else { + ossInfo = new DirectoryOssInfo(); + } + return ossInfo; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/QingYunOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/QingYunOssConfiguration.java new file mode 100644 index 0000000..f05bff8 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/QingYunOssConfiguration.java @@ -0,0 +1,93 @@ +package com.schisandra.oss.application.oss.core.qingyun; + +import cn.hutool.core.text.CharPool; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.aliyun.oss.OSSClient; +import com.qingstor.sdk.config.EnvContext; +import com.qingstor.sdk.service.Bucket; +import com.qingstor.sdk.service.QingStor; + +import com.schisandra.oss.application.convert.SchisandraOssJdDTOConverter; +import com.schisandra.oss.application.convert.SchisandraOssQingyunDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssJdDTO; +import com.schisandra.oss.application.dto.SchisandraOssQingyunDTO; +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.jd.model.JdOssConfig; +import com.schisandra.oss.application.oss.core.qingyun.model.QingYunOssClientConfig; +import com.schisandra.oss.application.oss.core.qingyun.model.QingYunOssConfig; +import com.schisandra.oss.domain.bo.SchisandraOssJdBO; +import com.schisandra.oss.domain.bo.SchisandraOssQingyunBO; +import com.schisandra.oss.domain.service.SchisandraOssQingyunDomainService; +import com.schisandra.oss.infra.basic.entity.SchisandraOssQingyun; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.Optional; + +/** + * @description: qingyun oss配置 + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 11:27 + */ +@Component +@Slf4j +public class QingYunOssConfiguration { + + @Resource + private SchisandraOssQingyunDomainService schisandraOssQingyunDomainService; + + public StandardOssClient qingYunOssClient(String userId) { + SchisandraOssQingyunBO schisandraOssQingyunBO = schisandraOssQingyunDomainService.getQingyunOssConfig(userId); + SchisandraOssQingyunDTO schisandraOssQingyunDTO = SchisandraOssQingyunDTOConverter.INSTANCE.convertBOToDTO(schisandraOssQingyunBO); + if (ObjectUtil.isEmpty(schisandraOssQingyunDTO)) { + log.error("Qingyun oss配置信息获取失败"); + return null; + } + String endpoint = schisandraOssQingyunDTO.getEndpoint(); + String accessKey = schisandraOssQingyunDTO.getAccessKey(); + String accessSecret = schisandraOssQingyunDTO.getAccessSecret(); + String zone = schisandraOssQingyunDTO.getZone(); + + QingYunOssConfig qingYunOssConfig = new QingYunOssConfig(); + qingYunOssConfig.setEndpoint(endpoint); + qingYunOssConfig.setAccessKey(accessKey); + qingYunOssConfig.setAccessSecret(accessSecret); + qingYunOssConfig.setZone(zone); + return qingYunOssClient(qingYunOssConfig); + } + + public StandardOssClient qingYunOssClient(QingYunOssConfig qingYunOssConfig) { + QingStor qingStor = qingStor(qingYunOssConfig); + Bucket bucket = qingStor.getBucket(qingYunOssConfig.getBucketName(), qingYunOssConfig.getZone()); + return new QingYunOssClient(qingStor, bucket, qingYunOssConfig); + } + + public QingStor qingStor(QingYunOssConfig qingYunOssConfig) { + EnvContext env = new EnvContext(qingYunOssConfig.getAccessKey(), qingYunOssConfig.getAccessSecret()); + QingYunOssClientConfig clientConfig = Optional.ofNullable(qingYunOssConfig.getClientConfig()).orElse(new QingYunOssClientConfig()); + env.setHttpConfig(clientConfig.toClientConfig()); + String endpoint = qingYunOssConfig.getEndpoint(); + if (ObjectUtil.isNotEmpty(endpoint)) { + env.setEndpoint(endpoint); + } + env.setCnameSupport(clientConfig.isCnameSupport()); + String additionalUserAgent = clientConfig.getAdditionalUserAgent(); + if (ObjectUtil.isNotEmpty(additionalUserAgent)) { + env.setAdditionalUserAgent(additionalUserAgent); + } + env.setVirtualHostEnabled(clientConfig.isVirtualHostEnabled()); + return new QingStor(env); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/constant/QingYunOssConstant.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/constant/QingYunOssConstant.java new file mode 100644 index 0000000..cf7f132 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/constant/QingYunOssConstant.java @@ -0,0 +1,6 @@ +package com.schisandra.oss.application.oss.core.qingyun.constant; + + +public class QingYunOssConstant { + public static final String DEFAULT_ENDPOINT = "https://qingstor.com"; +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/model/QingYunOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/model/QingYunOssClientConfig.java new file mode 100644 index 0000000..2c643e3 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/model/QingYunOssClientConfig.java @@ -0,0 +1,44 @@ +package com.schisandra.oss.application.oss.core.qingyun.model; + +import com.qingstor.sdk.config.EnvContext; +import lombok.Data; +import lombok.experimental.Accessors; + + +@Data +@Accessors(chain = true) +public class QingYunOssClientConfig { + /** + * 是否支持CNAME作为Endpoint,默认不支持CNAME。 + */ + private boolean cnameSupport = false; + /** + * 附加的用户代理 + */ + private String additionalUserAgent; + /** + * 是否启用虚拟Host + */ + private boolean virtualHostEnabled = false; + /** + * 读超时时间 + */ + private int readTimeout = 100; + /** + * 写超时时间 + */ + private int writeTimeout = 100; + /** + * 连接超时时间 + */ + private int connectionTimeout = 60; + + public EnvContext.HttpConfig toClientConfig() { + EnvContext.HttpConfig httpConfig = new EnvContext.HttpConfig(); + httpConfig.setConnectionTimeout(connectionTimeout); + httpConfig.setReadTimeout(readTimeout); + httpConfig.setWriteTimeout(writeTimeout); + return httpConfig; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/model/QingYunOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/model/QingYunOssConfig.java new file mode 100644 index 0000000..66c30b9 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qingyun/model/QingYunOssConfig.java @@ -0,0 +1,33 @@ +package com.schisandra.oss.application.oss.core.qingyun.model; + + +import com.schisandra.oss.application.oss.core.qingyun.constant.QingYunOssConstant; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; + + +@Data +public class QingYunOssConfig { + + private String endpoint = QingYunOssConstant.DEFAULT_ENDPOINT; + private String accessKey; + private String accessSecret; + + private String bucketName; + private String zone; + private String basePath; + + private QingYunOssClientConfig clientConfig; + + /** + * 断点续传参数 + */ + private SliceConfig sliceConfig = new SliceConfig(); + + public void init() { + this.sliceConfig.init(); + basePath = OssPathUtil.valid(basePath); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/QiNiuOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/QiNiuOssClient.java new file mode 100644 index 0000000..a237bb8 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/QiNiuOssClient.java @@ -0,0 +1,305 @@ +package com.schisandra.oss.application.oss.core.qiniu; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.qiniu.common.QiniuException; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.DownloadUrl; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.FileInfo; +import com.qiniu.storage.model.FileListing; +import com.qiniu.storage.persistent.FileRecorder; +import com.qiniu.util.Auth; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.qiniu.model.QiNiuOssConfig; +import com.schisandra.oss.application.oss.exception.OssException; +import com.schisandra.oss.application.oss.model.DirectoryOssInfo; +import com.schisandra.oss.application.oss.model.FileOssInfo; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; +import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @description: qiniu oss client + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:00 + */ +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +public class QiNiuOssClient implements StandardOssClient { + + public static final String AUTH_OBJECT_NAME = "auth"; + public static final String UPLOAD_OBJECT_NAME = "uploadManager"; + public static final String BUCKET_OBJECT_NAME = "bucketManager"; + + private Auth auth; + private UploadManager uploadManager; + private BucketManager bucketManager; + private QiNiuOssConfig qiNiuOssConfig; + private Configuration configuration; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + try { + uploadManager.put(is, getKey(targetName, false), getUpToken(), null, null); + } catch (QiniuException e) { + String errorMsg = String.format("%s上传失败", targetName); + log.error(errorMsg, e); + throw new OssException(errorMsg, e); + } + return getInfo(targetName, false); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + String key = getKey(targetName, false); + + try { + FileRecorder fileRecorder = new FileRecorder(file.getParent()); + UploadManager uploadManager = new UploadManager(configuration, fileRecorder); + + uploadManager.put(file.getPath(), key, getUpToken()); + } catch (Exception e) { + String errorMsg = String.format("%s上传失败", targetName); + log.error(errorMsg, e); + throw new OssException(errorMsg, e); + } + return getInfo(targetName); + } + + @Override + public void downLoad(OutputStream os, String targetName) { + DownloadUrl downloadUrl = new DownloadUrl("qiniu.com", false, getKey(targetName, false)); + try { + String url = downloadUrl.buildURL(); + HttpUtil.download(url, os, false); + } catch (QiniuException e) { + String errorMsg = String.format("%s下载失败", targetName); + log.error(errorMsg, e); + throw new OssException(errorMsg, e); + } + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + downLoadFile(localFile, targetName, qiNiuOssConfig.getSliceConfig(), OssConstant.OssType.QINIU); + } + + @Override + public DownloadObjectStat getDownloadObjectStat(String targetName) { + try { + FileInfo fileInfo = bucketManager.stat(getBucket(), getKey(targetName, false)); + return new DownloadObjectStat().setSize(fileInfo.fsize) + .setLastModified(DateUtil.date(fileInfo.putTime / 10000)) + .setDigest(fileInfo.md5); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { + downloadCheckPoint.setMagic(DownloadCheckPoint.DOWNLOAD_MAGIC); + downloadCheckPoint.setDownloadFile(localFile.getPath()); + downloadCheckPoint.setBucketName(getBucket()); + downloadCheckPoint.setKey(getKey(targetName, false)); + downloadCheckPoint.setCheckPointFile(checkpointFile); + + downloadCheckPoint.setObjectStat(getDownloadObjectStat(targetName)); + + long downloadSize; + if (downloadCheckPoint.getObjectStat().getSize() > 0) { + Long partSize = qiNiuOssConfig.getSliceConfig().getPartSize(); + long[] slice = getDownloadSlice(new long[0], downloadCheckPoint.getObjectStat().getSize()); + downloadCheckPoint.setDownloadParts(splitDownloadFile(slice[0], slice[1], partSize)); + downloadSize = slice[1]; + } else { + //download whole file + downloadSize = 0; + downloadCheckPoint.setDownloadParts(splitDownloadOneFile()); + } + downloadCheckPoint.setOriginPartSize(downloadCheckPoint.getDownloadParts().size()); + createDownloadTemp(downloadCheckPoint.getTempDownloadFile(), downloadSize); + } + + @Override + public InputStream downloadPart(String key, long start, long end) { + try { + DownloadUrl downloadUrl = new DownloadUrl("qiniu.com", false, key); + String url = downloadUrl.buildURL(); + HttpResponse response = HttpUtil.createGet(url) + .timeout(-1) + .header("Range", "bytes=" + start + "-" + end) + .execute(); + log.debug("start={}, end={}", start, end); + return new ByteArrayInputStream(response.bodyBytes()); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void delete(String targetName) { + try { + bucketManager.delete(getBucket(), getKey(targetName, false)); + } catch (QiniuException e) { + String errorMsg = String.format("%s删除失败", targetName); + log.error(errorMsg, e); + throw new OssException(errorMsg, e); + } + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + try { + bucketManager.copy(getBucket(), getKey(sourceName, false), getBucket(), getKey(targetName, false), isOverride); + } catch (QiniuException e) { + String errorMsg = String.format("%s复制失败", targetName); + log.error(errorMsg, e); + throw new OssException(errorMsg, e); + } + } + + @Override + public void move(String sourceName, String targetName, Boolean isOverride) { + try { + bucketManager.move(getBucket(), getKey(sourceName, false), getBucket(), getKey(targetName, false), isOverride); + } catch (QiniuException e) { + String errorMsg = String.format("%s移动到%s失败", sourceName, targetName); + log.error(errorMsg, e); + throw new OssException(errorMsg, e); + } + } + + @Override + public void rename(String sourceName, String targetName, Boolean isOverride) { + try { + bucketManager.rename(getBucket(), getKey(sourceName, false), getKey(targetName, false), isOverride); + } catch (QiniuException e) { + String errorMsg = String.format("%s重命名为%s失败", sourceName, targetName); + log.error(errorMsg, e); + throw new OssException(errorMsg, e); + } + } + + @SneakyThrows + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + String key = getKey(targetName, false); + + OssInfo ossInfo = getBaseInfo(targetName); + if (isRecursion && isDirectory(key)) { + FileListing listFiles = bucketManager.listFiles(getBucket(), key, "", 1000, StrUtil.SLASH); + + System.out.println(listFiles); + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(listFiles.items)) { + for (FileInfo fileInfo : listFiles.items) { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(fileInfo.key, getBasePath(), false), false)); + } + } + + if (ObjectUtil.isNotEmpty(listFiles.commonPrefixes)) { + for (String commonPrefix : listFiles.commonPrefixes) { + String target = OssPathUtil.replaceKey(commonPrefix, getBasePath(), true); + directoryInfos.add(getInfo(target, true)); + } + } + if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + } + if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + } + return ossInfo; + } + + @Override + public String getBasePath() { + return qiNiuOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(AUTH_OBJECT_NAME, getAuth()); + put(UPLOAD_OBJECT_NAME, getUploadManager()); + put(BUCKET_OBJECT_NAME, getBucketManager()); + } + }; + } + + private String getUpToken() { + return auth.uploadToken(getBucket()); + } + + private String getBucket() { + String bucketName = qiNiuOssConfig.getBucketName(); + try { + if (ObjectUtil.isEmpty(bucketManager.getBucketInfo(bucketName))) { + bucketManager.createBucket(bucketName, qiNiuOssConfig.getClientConfig().getRegion().getRegion()); + } + } catch (QiniuException e) { + log.error("创建Bucket失败", e); + } + return bucketName; + } + + private OssInfo getBaseInfo(String targetName) { + String key = getKey(targetName, false); + OssInfo ossInfo; + if (isFile(targetName)) { + ossInfo = new FileOssInfo(); + try { + FileInfo fileInfo = bucketManager.stat(getBucket(), key); + String putTime = DateUtil.date(fileInfo.putTime / 10000).toString(DatePattern.NORM_DATETIME_PATTERN); + ossInfo.setLength(Convert.toStr(fileInfo.fsize)); + ossInfo.setCreateTime(putTime); + ossInfo.setLastUpdateTime(putTime); + } catch (QiniuException e) { + String errorMsg = String.format("获取%s信息失败", targetName); + log.error(errorMsg, e); + throw new OssException(errorMsg, e); + } + } else { + ossInfo = new DirectoryOssInfo(); + } + + ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); + ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); + + return ossInfo; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/QiNiuOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/QiNiuOssConfiguration.java new file mode 100644 index 0000000..35ea884 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/QiNiuOssConfiguration.java @@ -0,0 +1,91 @@ +package com.schisandra.oss.application.oss.core.qiniu; + + +import cn.hutool.core.util.ObjectUtil; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; +import com.schisandra.oss.application.convert.SchisandraOssQiniuDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssQiniuDTO; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.qiniu.model.QiNiuOssClientConfig; +import com.schisandra.oss.application.oss.core.qiniu.model.QiNiuOssConfig; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.domain.bo.SchisandraOssQiniuBO; +import com.schisandra.oss.domain.service.SchisandraOssQiniuDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Optional; + +/** + * @description: qiniu oss 配置类 + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 11:59 + */ +@Component +@Slf4j +public class QiNiuOssConfiguration { + + + @Resource + private SchisandraOssQiniuDomainService schisandraOssQiniuDomainService; + + + public StandardOssClient qiNiuOssClient(String userId) { + SchisandraOssQiniuBO schisandraOssQiniuBO = schisandraOssQiniuDomainService.getQiniuOssConfig(userId); + SchisandraOssQiniuDTO schisandraOssQiniuDTO = SchisandraOssQiniuDTOConverter.INSTANCE.convertBOToDTO(schisandraOssQiniuBO); + if (ObjectUtil.isEmpty(schisandraOssQiniuDTO)) { + log.error("jd oss配置信息获取失败"); + return null; + } + String accessKey = schisandraOssQiniuDTO.getAccessKey(); + String secretKey = schisandraOssQiniuDTO.getSecretKey(); + QiNiuOssConfig qiNiuOssConfig = new QiNiuOssConfig(); + qiNiuOssConfig.setAccessKey(accessKey); + qiNiuOssConfig.setSecretKey(secretKey); + return qiNiuOssClient(qiNiuOssConfig); + + } + + private StandardOssClient qiNiuOssClient(QiNiuOssConfig qiNiuOssConfig) { + Auth auth = auth(qiNiuOssConfig); + Configuration configuration = configuration(qiNiuOssConfig); + UploadManager uploadManager = uploadManager(configuration); + BucketManager bucketManager = bucketManager(auth, configuration); + return qiNiuOssClient(auth, uploadManager, bucketManager, qiNiuOssConfig, configuration); + } + + public StandardOssClient qiNiuOssClient(Auth auth, UploadManager uploadManager, BucketManager bucketManager, + QiNiuOssConfig qiNiuOssConfig, Configuration configuration) { + return new QiNiuOssClient(auth, uploadManager, bucketManager, qiNiuOssConfig, configuration); + } + + public Auth auth(QiNiuOssConfig qiNiuOssConfig) { + return Auth.create(qiNiuOssConfig.getAccessKey(), qiNiuOssConfig.getSecretKey()); + } + + public UploadManager uploadManager(Configuration configuration) { + return new UploadManager(configuration); + } + + public BucketManager bucketManager(Auth auth, Configuration configuration) { + return new BucketManager(auth, configuration); + } + + public Configuration configuration(QiNiuOssConfig qiNiuOssConfig) { + Configuration configuration = Optional.ofNullable(qiNiuOssConfig.getClientConfig()).orElse(new QiNiuOssClientConfig()).toClientConfig(); + SliceConfig sliceConfig = qiNiuOssConfig.getSliceConfig(); + configuration.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2; + configuration.resumableUploadMaxConcurrentTaskCount = sliceConfig.getTaskNum(); + configuration.resumableUploadAPIV2BlockSize = sliceConfig.getPartSize().intValue(); + return configuration; + } + + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/constant/QiNiuRegion.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/constant/QiNiuRegion.java new file mode 100644 index 0000000..fa30aea --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/constant/QiNiuRegion.java @@ -0,0 +1,54 @@ +package com.schisandra.oss.application.oss.core.qiniu.constant; + +import cn.hutool.core.util.ReflectUtil; +import com.qiniu.storage.Region; + +import java.lang.reflect.Method; + + +public enum QiNiuRegion { + /** + * 华东区域 + */ + HUADONG("huadong"), + /** + * 华北区域 + */ + HUABEI("huabei"), + /** + * 华南区域 + */ + HUANAN("huanan"), + /** + * 北美区域 + */ + BEIMEI("beimei"), + /** + * 新加坡区域 + */ + XINJIAPO("xinjiapo"), + /** + * + */ + AUTOREGION("autoRegion"); + + private final String region; + + QiNiuRegion(String region) { + this.region = region; + } + + public String getRegion() { + return region; + } + + @Override + public String toString() { + return region; + } + + public Region buildRegion() { + Method method = ReflectUtil.getMethodByName(Region.class, this.region); + return ReflectUtil.invokeStatic(method); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/model/QiNiuOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/model/QiNiuOssClientConfig.java new file mode 100644 index 0000000..c912866 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/model/QiNiuOssClientConfig.java @@ -0,0 +1,88 @@ +package com.schisandra.oss.application.oss.core.qiniu.model; + +import com.qiniu.common.Constants; +import com.qiniu.storage.Configuration; + +import com.schisandra.oss.application.oss.core.qiniu.constant.QiNiuRegion; +import lombok.Data; +import lombok.experimental.Accessors; + + +@Data +@Accessors(chain = true) +public class QiNiuOssClientConfig { + + /** + * 使用的Region + */ + public QiNiuRegion region = QiNiuRegion.AUTOREGION; + /** + * 空间相关上传管理操作是否使用 https , 默认 是 + */ + public boolean useHttpsDomains = true; + /** + * 空间相关上传管理操作是否使用代理加速上传,默认 是 + */ + public boolean accUpHostFirst = true; + /** + * 使用 AutoRegion 时,如果从区域信息得到上传 host 失败,使用默认的上传域名上传,默认 是 + * upload.qiniup.com, upload-z1.qiniup.com, upload-z2.qiniup.com, + * upload-na0.qiniup.com, upload-as0.qiniup.com + */ + public boolean useDefaultUpHostIfNone = true; + /** + * 如果文件大小大于此值则使用断点上传, 否则使用Form上传 + */ + public int putThreshold = Constants.BLOCK_SIZE; + /** + * 连接超时时间 单位秒(默认10s) + */ + public int connectTimeout = Constants.CONNECT_TIMEOUT; + /** + * 写超时时间 单位秒(默认 0 , 不超时) + */ + public int writeTimeout = Constants.WRITE_TIMEOUT; + /** + * 回复超时时间 单位秒(默认30s) + */ + public int readTimeout = Constants.READ_TIMEOUT; + /** + * 底层HTTP库所有的并发执行的请求数量 + */ + public int dispatcherMaxRequests = Constants.DISPATCHER_MAX_REQUESTS; + /** + * 底层HTTP库对每个独立的Host进行并发请求的数量 + */ + public int dispatcherMaxRequestsPerHost = Constants.DISPATCHER_MAX_REQUESTS_PER_HOST; + /** + * 底层HTTP库中复用连接对象的最大空闲数量 + */ + public int connectionPoolMaxIdleCount = Constants.CONNECTION_POOL_MAX_IDLE_COUNT; + /** + * 底层HTTP库中复用连接对象的回收周期(单位分钟) + */ + public int connectionPoolMaxIdleMinutes = Constants.CONNECTION_POOL_MAX_IDLE_MINUTES; + /** + * 上传失败重试次数 + */ + public int retryMax = 5; + + public Configuration toClientConfig() { + Configuration configuration = new Configuration(); + configuration.region = this.region.buildRegion(); + configuration.useHttpsDomains = useHttpsDomains; + configuration.accUpHostFirst = accUpHostFirst; + configuration.useDefaultUpHostIfNone = useDefaultUpHostIfNone; + configuration.putThreshold = putThreshold; + configuration.connectTimeout = connectTimeout; + configuration.writeTimeout = writeTimeout; + configuration.readTimeout = readTimeout; + configuration.dispatcherMaxRequests = dispatcherMaxRequests; + configuration.dispatcherMaxRequestsPerHost = dispatcherMaxRequestsPerHost; + configuration.connectionPoolMaxIdleCount = connectionPoolMaxIdleCount; + configuration.connectionPoolMaxIdleMinutes = connectionPoolMaxIdleMinutes; + configuration.retryMax = retryMax; + return configuration; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/model/QiNiuOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/model/QiNiuOssConfig.java new file mode 100644 index 0000000..3c163ba --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/qiniu/model/QiNiuOssConfig.java @@ -0,0 +1,26 @@ +package com.schisandra.oss.application.oss.core.qiniu.model; + +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; + + +@Data +public class QiNiuOssConfig { + + private String basePath; + private String accessKey; + private String secretKey; + private String bucketName; + private QiNiuOssClientConfig clientConfig; + + /** + * 断点续传参数 + */ + private SliceConfig sliceConfig = new SliceConfig(); + + public void init() { + this.sliceConfig.init(); + basePath = OssPathUtil.valid(basePath); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssClient.java new file mode 100644 index 0000000..61dc0a1 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssClient.java @@ -0,0 +1,295 @@ +package com.schisandra.oss.application.oss.core.tencent; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.qcloud.cos.COSClient; +import com.qcloud.cos.model.*; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.tencent.model.TencentOssConfig; +import com.schisandra.oss.application.oss.model.DirectoryOssInfo; +import com.schisandra.oss.application.oss.model.FileOssInfo; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; +import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; +import com.schisandra.oss.application.oss.model.upload.*; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TencentOssClient implements StandardOssClient { + + public static final String COS_OBJECT_NAME = "cosClient"; + + private COSClient cosClient; + private TencentOssConfig tencentOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + String bucketName = getBucket(); + String key = getKey(targetName, false); + + if (isOverride || !cosClient.doesObjectExist(bucketName, key)) { + cosClient.putObject(bucketName, key, is, new ObjectMetadata()); + } + return getInfo(targetName); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + uploadFile(file, targetName, tencentOssConfig.getSliceConfig(), OssConstant.OssType.TENCENT); + return getInfo(targetName); + } + + @Override + public void completeUpload(UpLoadCheckPoint upLoadCheckPoint, List partEntityTags) { + List eTags = partEntityTags.stream().sorted(Comparator.comparingInt(UpLoadPartEntityTag::getPartNumber)) + .map(partEntityTag -> new PartETag(partEntityTag.getPartNumber(), partEntityTag.getETag())).collect(Collectors.toList()); + + CompleteMultipartUploadRequest completeMultipartUploadRequest = + new CompleteMultipartUploadRequest(upLoadCheckPoint.getBucket(), upLoadCheckPoint.getKey(), upLoadCheckPoint.getUploadId(), eTags); + cosClient.completeMultipartUpload(completeMultipartUploadRequest); + + FileUtil.del(upLoadCheckPoint.getCheckpointFile()); + } + + @Override + public void prepareUpload(UpLoadCheckPoint uploadCheckPoint, File upLoadFile, String targetName, String checkpointFile, SliceConfig slice) { + String bucket = getBucket(); + String key = getKey(targetName, false); + + uploadCheckPoint.setMagic(UpLoadCheckPoint.UPLOAD_MAGIC); + uploadCheckPoint.setUploadFile(upLoadFile.getPath()); + uploadCheckPoint.setKey(key); + uploadCheckPoint.setBucket(bucket); + uploadCheckPoint.setCheckpointFile(checkpointFile); + uploadCheckPoint.setUploadFileStat(UpLoadFileStat.getFileStat(uploadCheckPoint.getUploadFile())); + + long partSize = slice.getPartSize(); + long fileLength = upLoadFile.length(); + int parts = (int) (fileLength / partSize); + if (fileLength % partSize > 0) { + parts++; + } + + uploadCheckPoint.setUploadParts(splitUploadFile(uploadCheckPoint.getUploadFileStat().getSize(), partSize)); + uploadCheckPoint.setPartEntityTags(new ArrayList<>()); + uploadCheckPoint.setOriginPartSize(parts); + + InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucket, key); + InitiateMultipartUploadResult result = cosClient.initiateMultipartUpload(request); + + uploadCheckPoint.setUploadId(result.getUploadId()); + } + + @Override + public UpLoadPartResult uploadPart(UpLoadCheckPoint upLoadCheckPoint, int partNum, InputStream inputStream) { + UpLoadPartResult partResult = null; + UploadPart uploadPart = upLoadCheckPoint.getUploadParts().get(partNum); + long partSize = uploadPart.getSize(); + partResult = new UpLoadPartResult(partNum + 1, uploadPart.getOffset(), partSize); + try { + inputStream.skip(uploadPart.getOffset()); + + UploadPartRequest uploadPartRequest = new UploadPartRequest(); + uploadPartRequest.setBucketName(upLoadCheckPoint.getBucket()); + uploadPartRequest.setKey(upLoadCheckPoint.getKey()); + uploadPartRequest.setUploadId(upLoadCheckPoint.getUploadId()); + uploadPartRequest.setInputStream(inputStream); + uploadPartRequest.setPartSize(partSize); + uploadPartRequest.setPartNumber(uploadPart.getNumber()); + + UploadPartResult uploadPartResponse = cosClient.uploadPart(uploadPartRequest); + + partResult.setNumber(uploadPartResponse.getPartNumber()); + partResult.setEntityTag(new UpLoadPartEntityTag().setETag(uploadPartResponse.getETag()) + .setPartNumber(uploadPartResponse.getPartNumber())); + } catch (Exception e) { + partResult.setFailed(true); + partResult.setException(e); + } finally { + IoUtil.close(inputStream); + } + + return partResult; + } + + @Override + public void downLoad(OutputStream os, String targetName) { + COSObject cosObject = cosClient.getObject(getBucket(), getKey(targetName, false)); + IoUtil.copy(cosObject.getObjectContent(), os); + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + downLoadFile(localFile, targetName, tencentOssConfig.getSliceConfig(), OssConstant.OssType.TENCENT); + } + + @Override + public DownloadObjectStat getDownloadObjectStat(String targetName) { + ObjectMetadata objectMetadata = cosClient.getObjectMetadata(getBucket(), getKey(targetName, false)); + DateTime date = DateUtil.date(objectMetadata.getLastModified()); + long contentLength = objectMetadata.getContentLength(); + String eTag = objectMetadata.getETag(); + return new DownloadObjectStat().setSize(contentLength).setLastModified(date).setDigest(eTag); + } + + @Override + public void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { + downloadCheckPoint.setMagic(DownloadCheckPoint.DOWNLOAD_MAGIC); + downloadCheckPoint.setDownloadFile(localFile.getPath()); + downloadCheckPoint.setBucketName(getBucket()); + downloadCheckPoint.setKey(getKey(targetName, false)); + downloadCheckPoint.setCheckPointFile(checkpointFile); + + downloadCheckPoint.setObjectStat(getDownloadObjectStat(targetName)); + + long downloadSize; + if (downloadCheckPoint.getObjectStat().getSize() > 0) { + Long partSize = tencentOssConfig.getSliceConfig().getPartSize(); + long[] slice = getDownloadSlice(new long[0], downloadCheckPoint.getObjectStat().getSize()); + downloadCheckPoint.setDownloadParts(splitDownloadFile(slice[0], slice[1], partSize)); + downloadSize = slice[1]; + } else { + //download whole file + downloadSize = 0; + downloadCheckPoint.setDownloadParts(splitDownloadOneFile()); + } + downloadCheckPoint.setOriginPartSize(downloadCheckPoint.getDownloadParts().size()); + createDownloadTemp(downloadCheckPoint.getTempDownloadFile(), downloadSize); + } + + @Override + public InputStream downloadPart(String key, long start, long end) { + GetObjectRequest request = new GetObjectRequest(getBucket(), key); + request.setRange(start, end); + COSObject object = cosClient.getObject(request); + return object.getObjectContent(); + } + + @Override + public void delete(String targetName) { + cosClient.deleteObject(getBucket(), getKey(targetName, false)); + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + String bucketName = getBucket(); + String targetKey = getKey(targetName, false); + if (isOverride || !cosClient.doesObjectExist(bucketName, targetKey)) { + cosClient.copyObject(getBucket(), getKey(sourceName, false), getBucket(), targetKey); + } + } + + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + String key = getKey(targetName, false); + + OssInfo ossInfo = getBaseInfo(key); + ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); + ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); + + if (isRecursion && isDirectory(key)) { + String prefix = OssPathUtil.convertPath(key, false); + ObjectListing listObjects = cosClient.listObjects(getBucket(), prefix.endsWith(StrUtil.SLASH) ? prefix : prefix + StrUtil.SLASH); + + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + for (COSObjectSummary cosObjectSummary : listObjects.getObjectSummaries()) { + if (FileNameUtil.getName(cosObjectSummary.getKey()).equals(FileNameUtil.getName(key))) { + ossInfo.setLastUpdateTime(DateUtil.date(cosObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(cosObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(cosObjectSummary.getSize())); + } else { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(cosObjectSummary.getKey(), getBasePath(), false), false)); + } + } + + for (String commonPrefix : listObjects.getCommonPrefixes()) { + String target = OssPathUtil.replaceKey(commonPrefix, getBasePath(), false); + if (isDirectory(commonPrefix)) { + directoryInfos.add(getInfo(target, true)); + } else { + fileOssInfos.add(getInfo(target, false)); + } + } + if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + } + if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + } + + return ossInfo; + } + + @Override + public Boolean isExist(String targetName) { + return cosClient.doesObjectExist(getBucket(), getKey(targetName, false)); + } + + @Override + public String getBasePath() { + return tencentOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(COS_OBJECT_NAME, getCosClient()); + } + }; + } + + private String getBucket() { + String bucketName = tencentOssConfig.getBucketName(); + if (!cosClient.doesBucketExist(bucketName)) { + cosClient.createBucket(bucketName); + } + return bucketName; + } + + public OssInfo getBaseInfo(String key) { + OssInfo ossInfo; + + if (isFile(key)) { + ossInfo = new FileOssInfo(); + try { + ObjectMetadata objectMetadata = cosClient.getObjectMetadata(getBucket(), key); + ossInfo.setLastUpdateTime(DateUtil.date(objectMetadata.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(objectMetadata.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(objectMetadata.getContentLength())); + } catch (Exception e) { + log.error("获取{}文件属性失败", key, e); + } + } else { + ossInfo = new DirectoryOssInfo(); + } + return ossInfo; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssConfiguration.java new file mode 100644 index 0000000..ab76c85 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssConfiguration.java @@ -0,0 +1,71 @@ +package com.schisandra.oss.application.oss.core.tencent; + +import cn.hutool.core.util.ObjectUtil; +import com.qcloud.cos.COSClient; +import com.qcloud.cos.ClientConfig; +import com.qcloud.cos.auth.BasicCOSCredentials; +import com.qcloud.cos.auth.COSCredentials; +import com.schisandra.oss.application.convert.SchisandraOssTencentDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssTencentDTO; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.tencent.model.TencentOssClientConfig; +import com.schisandra.oss.application.oss.core.tencent.model.TencentOssConfig; +import com.schisandra.oss.domain.bo.SchisandraOssTencentBO; +import com.schisandra.oss.domain.service.SchisandraOssTencentDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Optional; + +/** + * @author zlg + * @description:腾讯云对象存储配置 + * @param: + * @return: + * @date: 2024/6/25 14:03 + */ +@Component +@Slf4j +public class TencentOssConfiguration { + + @Resource + private SchisandraOssTencentDomainService schisandraOssTencentDomainService; + + + public StandardOssClient tencentOssClient(String userId) { + SchisandraOssTencentBO schisandraOssTencentBO = schisandraOssTencentDomainService.getTencentOssConfig(userId); + SchisandraOssTencentDTO schisandraOssTencentDTO = SchisandraOssTencentDTOConverter.INSTANCE.convertBOToDTO(schisandraOssTencentBO); + if (ObjectUtil.isEmpty(schisandraOssTencentDTO)) { + log.error("Tencent oss配置信息获取失败"); + return null; + } + String secretId = schisandraOssTencentDTO.getSecretId(); + String secretKey = schisandraOssTencentDTO.getSecretKey(); + TencentOssConfig tencentOssConfig = new TencentOssConfig(); + tencentOssConfig.setSecretId(secretId); + tencentOssConfig.setSecretKey(secretKey); + return tencentOssClient(tencentOssConfig); + + + } + + private StandardOssClient tencentOssClient(TencentOssConfig tencentOssConfig) { + TencentOssClientConfig clientConfig = Optional.ofNullable(tencentOssConfig.getClientConfig()).orElse(new TencentOssClientConfig()); + COSCredentials cosCredentials = cosCredentials(tencentOssConfig); + COSClient cosClient = cosClient(cosCredentials, clientConfig.toClientConfig()); + return tencentOssClient(cosClient, tencentOssConfig); + } + + public StandardOssClient tencentOssClient(COSClient cosClient, TencentOssConfig tencentOssConfig) { + return new TencentOssClient(cosClient, tencentOssConfig); + } + + public COSCredentials cosCredentials(TencentOssConfig tencentOssConfig) { + return new BasicCOSCredentials(tencentOssConfig.getSecretId(), tencentOssConfig.getSecretKey()); + } + + public COSClient cosClient(COSCredentials cred, ClientConfig clientConfig) { + return new COSClient(cred, clientConfig); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/constant/TencentOssConstant.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/constant/TencentOssConstant.java new file mode 100644 index 0000000..fb7b3bf --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/constant/TencentOssConstant.java @@ -0,0 +1,50 @@ +package com.schisandra.oss.application.oss.core.tencent.constant; + +import com.qcloud.cos.utils.VersionInfoUtils; + +/** + * @description: 腾讯云OSS常量类 + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:03 + */ +public class TencentOssConstant { + /** + * 默认的获取连接的超时时间, 单位ms + */ + public static final int DEFAULT_CONNECTION_REQUEST_TIMEOUT = -1; + /** + * 默认连接超时, 单位ms + */ + public static final int DEFAULT_CONNECTION_TIMEOUT = 30 * 1000; + /** + * 默认的SOCKET读取超时时间, 单位ms + */ + public static final int DEFAULT_SOCKET_TIMEOUT = 30 * 1000; + /** + * 默认的维护最大HTTP连接数 + */ + public static final int DEFAULT_MAX_CONNECTIONS_COUNT = 1024; + /** + * 空闲连接最长存活时间 + */ + public static final int DEFAULT_IDLE_CONNECTION_ALIVE = 60 * 1000; + /** + * 多次签名的默认过期时间,单位秒 + */ + public static final long DEFAULT_SIGN_EXPIRED = 3600; + /** + * 默认的user_agent标识 + */ + public static final String DEFAULT_USER_AGENT = VersionInfoUtils.getUserAgent(); + /** + * Read Limit + */ + public static final int DEFAULT_READ_LIMIT = (2 << 17) + 1; + /** + * 发生异常时的最大重试次数 + */ + public static final int DEFAULT_RETRY_TIMES = 3; + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssClientConfig.java new file mode 100644 index 0000000..700da1f --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssClientConfig.java @@ -0,0 +1,99 @@ +package com.schisandra.oss.application.oss.core.tencent.model; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.util.ObjectUtil; +import com.qcloud.cos.ClientConfig; +import com.qcloud.cos.http.HttpProtocol; +import com.qcloud.cos.region.Region; +import lombok.Data; +import lombok.experimental.Accessors; + +import static com.schisandra.oss.application.oss.core.tencent.constant.TencentOssConstant.*; + + +@Data +@Accessors(chain = true) +public class TencentOssClientConfig { + /** + * 地域 + */ + private String region; + /** + * 连接OSS所采用的协议(HTTP或HTTPS),默认为HTTPS。 + */ + private HttpProtocol httpProtocol = HttpProtocol.https; + /** + * 域名后缀 + */ + private String endPointSuffix = null; + /** + * http proxy代理,如果使用http proxy代理,需要设置IP与端口 + */ + private String httpProxyIp = null; + /** + * 代理服务器端口 + */ + private int httpProxyPort = 0; + /** + * 代理服务器验证的用户名。 + */ + private String proxyUsername = null; + /** + * 代理服务器验证的密码。 + */ + private String proxyPassword = null; + /** + * 是否使用基本身份验证 + */ + private boolean useBasicAuth = false; + /** + * 多次签名的过期时间,单位秒 + */ + private long signExpired = DEFAULT_SIGN_EXPIRED; + /** + * 获取连接的超时时间, 单位ms + */ + private int connectionRequestTimeout = DEFAULT_CONNECTION_REQUEST_TIMEOUT; + /** + * 默认连接超时, 单位ms + */ + private int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT; + /** + * SOCKET读取超时时间, 单位ms + */ + private int socketTimeout = DEFAULT_SOCKET_TIMEOUT; + /** + * 最大HTTP连接数 + */ + private int maxConnectionsCount = DEFAULT_MAX_CONNECTIONS_COUNT; + /** + * 空闲连接存活时间 + */ + private int idleConnectionAlive = DEFAULT_IDLE_CONNECTION_ALIVE; + /** + * user_agent标识 + */ + private String userAgent = DEFAULT_USER_AGENT; + /** + * 读取限制 + */ + private int readLimit = DEFAULT_READ_LIMIT; + /** + * 数据万象特殊请求配置 + */ + private boolean ciSpecialRequest = false; + /** + * 请求失败后最大的重试次数。默认3次。 + **/ + private int maxErrorRetry = DEFAULT_RETRY_TIMES; + + public ClientConfig toClientConfig() { + ClientConfig clientConfig = new ClientConfig(); + BeanUtil.copyProperties(this, clientConfig, new CopyOptions().setIgnoreNullValue(true).setIgnoreProperties("region")); + if (ObjectUtil.isNotEmpty(region)) { + clientConfig.setRegion(new Region(region)); + } + return clientConfig; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssConfig.java new file mode 100644 index 0000000..a743b51 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssConfig.java @@ -0,0 +1,29 @@ +package com.schisandra.oss.application.oss.core.tencent.model; + + +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; + + +@Data +public class TencentOssConfig { + + private String basePath; + private String bucketName; + private String secretId; + private String secretKey; + + private TencentOssClientConfig clientConfig; + + /** + * 断点续传参数 + */ + private SliceConfig sliceConfig = new SliceConfig(); + + public void init() { + this.sliceConfig.init(); + basePath = OssPathUtil.valid(basePath); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/UCloudOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/UCloudOssClient.java new file mode 100644 index 0000000..913884b --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/UCloudOssClient.java @@ -0,0 +1,343 @@ +package com.schisandra.oss.application.oss.core.ucloud; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import cn.ucloud.ufile.UfileClient; +import cn.ucloud.ufile.api.object.ObjectApiBuilder; +import cn.ucloud.ufile.api.object.multi.MultiUploadInfo; +import cn.ucloud.ufile.api.object.multi.MultiUploadPartState; +import cn.ucloud.ufile.bean.DownloadFileBean; +import cn.ucloud.ufile.bean.ObjectInfoBean; +import cn.ucloud.ufile.bean.ObjectListBean; +import cn.ucloud.ufile.bean.ObjectProfile; +import cn.ucloud.ufile.exception.UfileClientException; +import cn.ucloud.ufile.util.StorageType; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.ucloud.model.UCloudOssConfig; +import com.schisandra.oss.application.oss.exception.OssException; +import com.schisandra.oss.application.oss.model.DirectoryOssInfo; +import com.schisandra.oss.application.oss.model.FileOssInfo; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; +import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; +import com.schisandra.oss.application.oss.model.upload.*; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @description:UCloud OSS 客户端 + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:20 + */ +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UCloudOssClient implements StandardOssClient { + + public static final String OBJECT_OBJECT_NAME = "objectApiBuilder"; + + private UfileClient ufileClient; + private ObjectApiBuilder objectApiBuilder; + private UCloudOssConfig uCloudOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + String bucketName = getBucket(); + String key = getKey(targetName, false); + + if (isOverride || !isExist(targetName)) { + try { + objectApiBuilder.putObject(is, 0, "") + .nameAs(key) + .toBucket(bucketName) + .execute(); + } catch (Exception e) { + throw new OssException(e); + } + } + return getInfo(targetName); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + uploadFile(file, targetName, uCloudOssConfig.getSliceConfig(), OssConstant.OssType.UCLOUD); + return getInfo(targetName); + } + + @Override + public void completeUpload(UpLoadCheckPoint upLoadCheckPoint, List partEntityTags) { + List partStates = partEntityTags.stream().sorted(Comparator.comparingInt(UpLoadPartEntityTag::getPartNumber)) + .map(partEntityTag -> { + MultiUploadPartState multiUploadPartState = new MultiUploadPartState(); + // TODO + return multiUploadPartState; + }).collect(Collectors.toList()); + + MultiUploadInfo multiUploadInfo = new MultiUploadInfo(); + objectApiBuilder.finishMultiUpload(multiUploadInfo, partStates); + + FileUtil.del(upLoadCheckPoint.getCheckpointFile()); + } + + @Override + public void prepareUpload(UpLoadCheckPoint uploadCheckPoint, File upLoadFile, String targetName, String checkpointFile, SliceConfig slice) { + String bucket = getBucket(); + String key = getKey(targetName, false); + + uploadCheckPoint.setMagic(UpLoadCheckPoint.UPLOAD_MAGIC); + uploadCheckPoint.setUploadFile(upLoadFile.getPath()); + uploadCheckPoint.setKey(key); + uploadCheckPoint.setBucket(bucket); + uploadCheckPoint.setCheckpointFile(checkpointFile); + uploadCheckPoint.setUploadFileStat(UpLoadFileStat.getFileStat(uploadCheckPoint.getUploadFile())); + + long partSize = slice.getPartSize(); + long fileLength = upLoadFile.length(); + int parts = (int) (fileLength / partSize); + if (fileLength % partSize > 0) { + parts++; + } + + uploadCheckPoint.setUploadParts(splitUploadFile(uploadCheckPoint.getUploadFileStat().getSize(), partSize)); + uploadCheckPoint.setPartEntityTags(new ArrayList<>()); + uploadCheckPoint.setOriginPartSize(parts); + + try { + MultiUploadInfo multiUploadInfo = objectApiBuilder.initMultiUpload(key, "", bucket).withStorageType(StorageType.STANDARD).execute(); + uploadCheckPoint.setUploadId(multiUploadInfo.getUploadId()); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public UpLoadPartResult uploadPart(UpLoadCheckPoint upLoadCheckPoint, int partNum, InputStream inputStream) { + UploadPart uploadPart = upLoadCheckPoint.getUploadParts().get(partNum); + long partSize = uploadPart.getSize(); + UpLoadPartResult partResult = new UpLoadPartResult(partNum + 1, uploadPart.getOffset(), partSize); + try { + inputStream.skip(uploadPart.getOffset()); + + MultiUploadInfo multiUploadInfo = new MultiUploadInfo(); + MultiUploadPartState multiUploadPartState = objectApiBuilder.multiUploadPart(multiUploadInfo, null, partNum) + .from(null, Convert.toInt(uploadPart.getOffset()), Convert.toInt(partSize), partNum).execute(); + + partResult.setNumber(multiUploadPartState.getPartIndex()); + partResult.setEntityTag(new UpLoadPartEntityTag().setETag(multiUploadPartState.geteTag()) + .setPartNumber(multiUploadPartState.getPartIndex())); + } catch (Exception e) { + partResult.setFailed(true); + partResult.setException(e); + } finally { + IoUtil.close(inputStream); + } + + return partResult; + } + + @Override + public void downLoad(OutputStream os, String targetName) { + ObjectProfile objectProfile = new ObjectProfile(); + objectProfile.setBucket(getBucket()); + objectProfile.setKeyName(getKey(targetName, false)); + try { + DownloadFileBean downloadFileBean = objectApiBuilder.downloadFile(objectProfile).execute(); + IoUtil.copy(FileUtil.getInputStream(downloadFileBean.getFile()), os); + } catch (UfileClientException e) { + throw new OssException(e); + } + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + downLoadFile(localFile, targetName, uCloudOssConfig.getSliceConfig(), OssConstant.OssType.UCLOUD); + } + + @Override + public DownloadObjectStat getDownloadObjectStat(String targetName) { + try { + ObjectProfile objectProfile = objectApiBuilder.objectProfile(getKey(targetName, false), getBucket()).execute(); + DateTime date = DateUtil.parse(objectProfile.getLastModified()); + long contentLength = objectProfile.getContentLength(); + String eTag = objectProfile.geteTag(); + return new DownloadObjectStat().setSize(contentLength).setLastModified(date).setDigest(eTag); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { + downloadCheckPoint.setMagic(DownloadCheckPoint.DOWNLOAD_MAGIC); + downloadCheckPoint.setDownloadFile(localFile.getPath()); + downloadCheckPoint.setBucketName(getBucket()); + downloadCheckPoint.setKey(getKey(targetName, false)); + downloadCheckPoint.setCheckPointFile(checkpointFile); + + downloadCheckPoint.setObjectStat(getDownloadObjectStat(targetName)); + + long downloadSize; + if (downloadCheckPoint.getObjectStat().getSize() > 0) { + Long partSize = uCloudOssConfig.getSliceConfig().getPartSize(); + long[] slice = getDownloadSlice(new long[0], downloadCheckPoint.getObjectStat().getSize()); + downloadCheckPoint.setDownloadParts(splitDownloadFile(slice[0], slice[1], partSize)); + downloadSize = slice[1]; + } else { + //download whole file + downloadSize = 0; + downloadCheckPoint.setDownloadParts(splitDownloadOneFile()); + } + downloadCheckPoint.setOriginPartSize(downloadCheckPoint.getDownloadParts().size()); + createDownloadTemp(downloadCheckPoint.getTempDownloadFile(), downloadSize); + } + + @Override + public InputStream downloadPart(String key, long start, long end) { + ObjectProfile objectProfile = new ObjectProfile(); + objectProfile.setBucket(getBucket()); + objectProfile.setKeyName(key); + try { + DownloadFileBean downloadFileBean = objectApiBuilder.downloadFile(objectProfile).withinRange(start, end).execute(); + return FileUtil.getInputStream(downloadFileBean.getFile()); + } catch (UfileClientException e) { + throw new OssException(e); + } + } + + @Override + public void delete(String targetName) { + objectApiBuilder.deleteObject(getBucket(), getKey(targetName, false)); + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + String bucketName = getBucket(); + String targetKey = getKey(targetName, false); + if (isOverride || !isExist(targetName)) { + try { + objectApiBuilder.copyObject(bucketName, getKey(sourceName, false)).copyTo(bucketName, targetKey).execute(); + } catch (Exception e) { + throw new OssException(e); + } + } + } + + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + String key = getKey(targetName, false); + + OssInfo ossInfo = getBaseInfo(key); + ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); + ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); + + if (isRecursion && isDirectory(key)) { + String prefix = OssPathUtil.convertPath(key, false); + ObjectListBean objectListBean; + try { + objectListBean = objectApiBuilder.objectList(getBucket()) + .withPrefix(prefix.endsWith(StrUtil.SLASH) ? prefix : prefix + StrUtil.SLASH) + .execute(); + } catch (Exception e) { + throw new OssException(e); + } + + List objectList = objectListBean.getObjectList(); + + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + for (ObjectInfoBean objectInfoBean : objectList) { + String fileName = objectInfoBean.getFileName(); + if (FileNameUtil.getName(fileName).equals(FileNameUtil.getName(key))) { + ossInfo.setLastUpdateTime(DateUtil.date(objectInfoBean.getModifyTime()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(objectInfoBean.getCreateTime()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(objectInfoBean.getSize())); + } else if (isDirectory(fileName)) { + directoryInfos.add(getInfo(OssPathUtil.replaceKey(fileName, getBasePath(), false), true)); + } else { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(fileName, getBasePath(), false), false)); + } + } + + if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + } + if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + } + + return ossInfo; + } + + @Override + public Boolean isExist(String targetName) { + try { + ObjectProfile objectProfile = objectApiBuilder.objectProfile(getKey(targetName, false), getBucket()).execute(); + return objectProfile.getContentLength() > 0; + } catch (Exception e) { + log.error("", e); + return false; + } + } + + @Override + public String getBasePath() { + return uCloudOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(OBJECT_OBJECT_NAME, getObjectApiBuilder()); + } + }; + } + + private String getBucket() { + return uCloudOssConfig.getBucketName(); + } + + public OssInfo getBaseInfo(String key) { + OssInfo ossInfo; + + if (isFile(key)) { + ossInfo = new FileOssInfo(); + try { + ObjectProfile objectProfile = getObjectApiBuilder().objectProfile(OssPathUtil.replaceKey(key, getBasePath(), false), getBucket()).execute(); + ossInfo.setLastUpdateTime(DateUtil.parse(objectProfile.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.parse(objectProfile.getCreateTime()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(objectProfile.getContentLength())); + } catch (Exception e) { + log.error("获取{}文件属性失败", key, e); + } + } else { + ossInfo = new DirectoryOssInfo(); + } + return ossInfo; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/UCloudOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/UCloudOssConfiguration.java new file mode 100644 index 0000000..193a758 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/UCloudOssConfiguration.java @@ -0,0 +1,57 @@ +package com.schisandra.oss.application.oss.core.ucloud; + +import cn.hutool.core.util.ObjectUtil; +import cn.ucloud.ufile.UfileClient; +import cn.ucloud.ufile.api.object.ObjectApiBuilder; +import cn.ucloud.ufile.api.object.ObjectConfig; +import cn.ucloud.ufile.auth.ObjectAuthorization; +import cn.ucloud.ufile.auth.UfileObjectLocalAuthorization; +import com.schisandra.oss.application.convert.SchisandraOssUcloudDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssUcloudDTO; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.ucloud.model.UCloudOssClientConfig; +import com.schisandra.oss.application.oss.core.ucloud.model.UCloudOssConfig; +import com.schisandra.oss.domain.bo.SchisandraOssUcloudBO; +import com.schisandra.oss.domain.service.SchisandraOssUcloudDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Optional; + +@Component +@Slf4j +public class UCloudOssConfiguration { + + + @Resource + private SchisandraOssUcloudDomainService schisandraOssUcloudDomainService; + + public StandardOssClient uCloudOssClient(String userId) { + SchisandraOssUcloudBO schisandraOssUcloudBO = schisandraOssUcloudDomainService.getUcloudOssConfig(userId); + SchisandraOssUcloudDTO schisandraOssUcloudDTO = SchisandraOssUcloudDTOConverter.INSTANCE.convertBOToDTO(schisandraOssUcloudBO); + if (ObjectUtil.isEmpty(schisandraOssUcloudDTO)) { + log.error("Ucloud oss配置信息获取失败"); + return null; + } + String publicKey = schisandraOssUcloudDTO.getPublicKey(); + String privateKey = schisandraOssUcloudDTO.getPrivateKey(); + String customHost = schisandraOssUcloudDTO.getCustomHost(); + UCloudOssConfig uCloudOssConfig = new UCloudOssConfig(); + uCloudOssConfig.setPublicKey(publicKey); + uCloudOssConfig.setPrivateKey(privateKey); + uCloudOssConfig.setCustomHost(customHost); + return uCloudOssClient(uCloudOssConfig); + + } + + public StandardOssClient uCloudOssClient(UCloudOssConfig uCloudOssConfig) { + UCloudOssClientConfig clientConfig = Optional.ofNullable(uCloudOssConfig.getClientConfig()).orElse(new UCloudOssClientConfig()); + UfileClient.Config config = new UfileClient.Config(clientConfig.toClientConfig()); + ObjectAuthorization objectAuthorization = new UfileObjectLocalAuthorization(uCloudOssConfig.getPublicKey(), uCloudOssConfig.getPrivateKey()); + ObjectConfig objectConfig = new ObjectConfig(uCloudOssConfig.getCustomHost()); + UfileClient ufileClient = UfileClient.configure(config); + ObjectApiBuilder objectApiBuilder = new ObjectApiBuilder(ufileClient, objectAuthorization, objectConfig); + return new UCloudOssClient(ufileClient, objectApiBuilder, uCloudOssConfig); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/model/UCloudOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/model/UCloudOssClientConfig.java new file mode 100644 index 0000000..0dacded --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/model/UCloudOssClientConfig.java @@ -0,0 +1,45 @@ +package com.schisandra.oss.application.oss.core.ucloud.model; + +import cn.hutool.core.bean.BeanUtil; +import cn.ucloud.ufile.http.HttpClient; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.concurrent.TimeUnit; + +import static cn.ucloud.ufile.http.HttpClient.Config.*; + +@Data +@Accessors(chain = true) +public class UCloudOssClientConfig { + /** + * 连接超时时间 + */ + private long timeoutConnect = DEFAULT_CONNECT_TIMEOUT; + /** + * 读超时时间 + */ + private long timeoutRead = DEFAULT_WRITE_TIMEOUT; + /** + * 写超时时间 + */ + private long timeoutWrite = DEFAULT_READ_TIMEOUT; + /** + * okhttp最大空闲连接数(5) + */ + private int maxIdleConnections = DEFAULT_MAX_IDLE_CONNECTIONS; + /** + * okhttp活动链接存货时间(5分钟) + */ + private long keepAliveDuration = DEFAULT_KEEP_ALIVE_DURATION_MINUTES; + /** + * okhttp活动链接存货时间单位, (分钟) + */ + private TimeUnit keepAliveTimeUnit = DEFAULT_KEEP_ALIVE_DURATION_TIME_UNIT; + + public HttpClient.Config toClientConfig() { + HttpClient.Config config = new HttpClient.Config(); + BeanUtil.copyProperties(this, config); + return config; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/model/UCloudOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/model/UCloudOssConfig.java new file mode 100644 index 0000000..67cb253 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ucloud/model/UCloudOssConfig.java @@ -0,0 +1,30 @@ +package com.schisandra.oss.application.oss.core.ucloud.model; + + +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; + + +@Data +public class UCloudOssConfig { + + private String basePath; + private String bucketName; + private String publicKey; + private String privateKey; + private String customHost; + + private UCloudOssClientConfig clientConfig; + + /** + * 断点续传参数 + */ + private SliceConfig sliceConfig = new SliceConfig(); + + public void init() { + this.sliceConfig.init(); + basePath = OssPathUtil.valid(basePath); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/UpOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/UpOssClient.java new file mode 100644 index 0000000..fac1a46 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/UpOssClient.java @@ -0,0 +1,236 @@ +package com.schisandra.oss.application.oss.core.up; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.LineHandler; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.up.constant.UpConstant; +import com.schisandra.oss.application.oss.core.up.model.UpOssConfig; +import com.schisandra.oss.application.oss.exception.OssException; +import com.schisandra.oss.application.oss.model.DirectoryOssInfo; +import com.schisandra.oss.application.oss.model.FileOssInfo; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import com.upyun.ParallelUploader; +import com.upyun.RestManager; +import com.upyun.UpException; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import okhttp3.Headers; +import okhttp3.Response; + +import java.io.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @description: + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:40 + */ +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UpOssClient implements StandardOssClient { + + public static final String REST_OBJECT_NAME = "restManager"; + public static final String PARALLEL_OBJECT_NAME = "parallelUploader"; + + private RestManager restManager; + private ParallelUploader parallelUploader; + private UpOssConfig upOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + try { + restManager.writeFile(getKey(targetName, true), is, null); + } catch (IOException | UpException e) { + log.error("{}上传失败", targetName, e); + throw new OssException(e); + } + return getInfo(targetName, false); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + try { + parallelUploader.upload(file.getPath(), getKey(targetName, true), null); + } catch (Exception e) { + throw new OssException(e); + } + return getInfo(targetName); + } + + @Override + public void downLoad(OutputStream os, String targetName) { + try { + Response response = restManager.readFile(getKey(targetName, true)); + IoUtil.copy(response.body().byteStream(), os); + } catch (IOException | UpException e) { + log.error("{}下载失败", targetName, e); + throw new OssException(e); + } + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + log.warn("又拍云不支持断点续传下载,将使用普通下载"); + try (OutputStream os = new FileOutputStream(localFile)) { + downLoad(os, targetName); + } catch (Exception e) { + log.error("{}下载失败", targetName, e); + throw new OssException(e); + } + } + + @Override + public void delete(String targetName) { + try { + restManager.deleteFile(getKey(targetName, true), null); + } catch (IOException | UpException e) { + log.error("{}删除失败", targetName, e); + throw new OssException(e); + } + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + try { + restManager.copyFile(getKey(targetName, true), getKey(sourceName, true), null); + } catch (IOException | UpException e) { + log.error("{}复制到{}失败", sourceName, targetName, e); + } + } + + @Override + public void move(String sourceName, String targetName, Boolean isOverride) { + String newSourceName = getKey(sourceName, true); + String newTargetName = getKey(targetName, true); + try { + if (isFile(newSourceName)) { + restManager.moveFile(targetName, sourceName, null); + } else { + restManager.mkDir(newTargetName); + restManager.rmDir(newSourceName); + } + } catch (IOException | UpException e) { + log.error("{}移动到{}失败", sourceName, targetName, e); + throw new OssException(e); + } + } + + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + String key = getKey(targetName, true); + try { + OssInfo ossInfo = getBaseInfo(key); + ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); + ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); + if (isRecursion && isDirectory(key)) { + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + Response response = restManager.readDirIter(key, null); + IoUtil.readUtf8Lines(response.body().byteStream(), (LineHandler) line -> { + List fields = StrUtil.split(line, "\t"); // vim.png N 164026 1638536314 + if (UpConstant.FILE_TYPE.equals(fields.get(1))) { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(key + StrUtil.SLASH + fields.get(0), getBasePath(), true), true)); + } else { + directoryInfos.add(getInfo(OssPathUtil.replaceKey(key + StrUtil.SLASH + fields.get(0), getBasePath(), true), true)); + } + }); + if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + } + if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + } + return ossInfo; + } catch (IOException | UpException e) { + log.error("获取{}基本信息失败", targetName, e); + throw new OssException(e); + } + } + + @Override + public Boolean isExist(String targetName) { + String key = getKey(targetName, true); + try { + if (isFile(targetName)) { + Response response = restManager.getFileInfo(key); + String fileSize = response.header(RestManager.PARAMS.X_UPYUN_FILE_SIZE.getValue(), "0"); + return Convert.toInt(fileSize) > 0; + } else { + DirectoryOssInfo ossInfo = getDirectoryOssInfo(key); + return Convert.toInt(ossInfo.getLength()) > 0; + } + } catch (IOException | UpException e) { + log.error("判断{}是否存在失败", targetName, e); + return false; + } + } + + @Override + public String getBasePath() { + return upOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(REST_OBJECT_NAME, getRestManager()); + put(PARALLEL_OBJECT_NAME, getParallelUploader()); + } + }; + } + + private OssInfo getBaseInfo(String key) throws UpException, IOException { + OssInfo ossInfo; + if (isFile(key)) { + ossInfo = new FileOssInfo(); + Response fileInfo = restManager.getFileInfo(key); + Headers headers = fileInfo.headers(); + ossInfo.setLength(headers.get(RestManager.PARAMS.X_UPYUN_FILE_SIZE.getValue())); + ossInfo.setCreateTime(DateUtil.date(headers.getDate(RestManager.PARAMS.X_UPYUN_FILE_DATE.getValue())).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLastUpdateTime(DateUtil.date(headers.getDate(RestManager.PARAMS.X_UPYUN_FILE_DATE.getValue())).toString(DatePattern.NORM_DATETIME_PATTERN)); + } else { + ossInfo = getDirectoryOssInfo(key); + } + return ossInfo; + } + + private DirectoryOssInfo getDirectoryOssInfo(String key) throws UpException, IOException { + String name = FileNameUtil.getName(key); + String newKey = OssPathUtil.replaceKey(key, name, true); + + Response response = restManager.readDirIter(newKey, null); + + DirectoryOssInfo ossInfo = new DirectoryOssInfo(); + IoUtil.readUtf8Lines(response.body().byteStream(), (LineHandler) line -> { + List fields = StrUtil.split(line, "\t"); // test Y 164026 1638536314 + if (name.equals(fields.get(0))) { + ossInfo.setName(fields.get(0)); + ossInfo.setPath(OssPathUtil.replaceKey(newKey, getBasePath(), true)); + ossInfo.setLength(fields.get(2)); + ossInfo.setCreateTime(DateUtil.date(Convert.toLong(fields.get(3)) * 1000).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLastUpdateTime(DateUtil.date(Convert.toLong(fields.get(3)) * 1000).toString(DatePattern.NORM_DATETIME_PATTERN)); + } + }); + return ossInfo; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/UpOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/UpOssConfiguration.java new file mode 100644 index 0000000..82da424 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/UpOssConfiguration.java @@ -0,0 +1,98 @@ +package com.schisandra.oss.application.oss.core.up; + +import cn.hutool.core.text.CharPool; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.schisandra.oss.application.convert.SchisandraOssUcloudDTOConverter; +import com.schisandra.oss.application.convert.SchisandraOssUpDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssUcloudDTO; +import com.schisandra.oss.application.dto.SchisandraOssUpDTO; +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.up.model.UpOssClientConfig; +import com.schisandra.oss.application.oss.core.up.model.UpOssConfig; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.domain.bo.SchisandraOssUcloudBO; +import com.schisandra.oss.domain.bo.SchisandraOssUpBO; +import com.schisandra.oss.domain.service.SchisandraOssUcloudDomainService; +import com.schisandra.oss.domain.service.SchisandraOssUpDomainService; +import com.upyun.ParallelUploader; +import com.upyun.RestManager; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.Optional; + +/** + * @description: + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:41 + */ +@Component +@Slf4j +public class UpOssConfiguration { + + + + @Resource + private SchisandraOssUpDomainService schisandraOssUpDomainService; + + + public StandardOssClient upOssClient(String userId) { + SchisandraOssUpBO schisandraOssUpBO = schisandraOssUpDomainService.getUpOssConfig(userId); + SchisandraOssUpDTO schisandraOssUpDTO = SchisandraOssUpDTOConverter.INSTANCE.convertBOToDTO(schisandraOssUpBO); + if (ObjectUtil.isEmpty(schisandraOssUpDTO)) { + log.error("Up oss配置信息获取失败"); + return null; + } + String userName = schisandraOssUpDTO.getUserName(); + String password = schisandraOssUpDTO.getPassword(); + UpOssConfig upOssConfig = new UpOssConfig(); + upOssConfig.setUserName(userName); + upOssConfig.setPassword(password); + return upOssClient(upOssConfig); + + } + + private StandardOssClient upOssClient(UpOssConfig upOssConfig) { + RestManager restManager = restManager(upOssConfig); + ParallelUploader parallelUploader = parallelUploader(upOssConfig); + return upOssClient(restManager, parallelUploader, upOssConfig); + } + + public StandardOssClient upOssClient(RestManager restManager, ParallelUploader parallelUploader, UpOssConfig upOssConfig) { + return new UpOssClient(restManager, parallelUploader, upOssConfig); + } + + public RestManager restManager(UpOssConfig upOssConfig) { + RestManager restManager = new RestManager(upOssConfig.getBucketName(), upOssConfig.getUserName(), upOssConfig.getPassword()); + UpOssClientConfig clientConfig = Optional.ofNullable(upOssConfig.getClientConfig()).orElse(new UpOssClientConfig()); + // 手动设置超时时间:默认为30秒 + restManager.setTimeout(clientConfig.getTimeout()); + // 选择最优的接入点 + restManager.setApiDomain(clientConfig.getApiDomain().toString()); + return restManager; + } + + public ParallelUploader parallelUploader(UpOssConfig upOssConfig) { + ParallelUploader parallelUploader = new ParallelUploader(upOssConfig.getBucketName(), upOssConfig.getUserName(), upOssConfig.getPassword()); + + SliceConfig sliceConfig = upOssConfig.getSliceConfig(); + parallelUploader.setParallel(sliceConfig.getTaskNum()); + parallelUploader.setCheckMD5(true); + UpOssClientConfig clientConfig = Optional.ofNullable(upOssConfig.getClientConfig()).orElse(new UpOssClientConfig()); + parallelUploader.setTimeout(clientConfig.getTimeout()); + return parallelUploader; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/constant/ApiDomain.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/constant/ApiDomain.java new file mode 100644 index 0000000..92f80b6 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/constant/ApiDomain.java @@ -0,0 +1,44 @@ +package com.schisandra.oss.application.oss.core.up.constant; + +import com.upyun.RestManager; + +/** + * @description:API域名 + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:39 + */ +public enum ApiDomain { + /** + * 根据网络条件自动选择接入点:v0.api.upyun.com + */ + ED_AUTO(RestManager.ED_AUTO), + /** + * 电信接入点:v1.api.upyun.com + */ + ED_TELECOM(RestManager.ED_TELECOM), + /** + * 联通网通接入点:v2.api.upyun.com + */ + ED_CNC(RestManager.ED_CNC), + /** + * 移动铁通接入点:v3.api.upyun.com + */ + ED_CTT(RestManager.ED_CTT); + + private final String value; + + ApiDomain(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + @Override + public String toString() { + return value; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/constant/UpConstant.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/constant/UpConstant.java new file mode 100644 index 0000000..9e819c2 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/constant/UpConstant.java @@ -0,0 +1,6 @@ +package com.schisandra.oss.application.oss.core.up.constant; + +public class UpConstant { + public static final String FILE_TYPE = "N"; + public static final String DIRECTORY_TYPE = "Y"; +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/model/UpOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/model/UpOssClientConfig.java new file mode 100644 index 0000000..0c558d9 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/model/UpOssClientConfig.java @@ -0,0 +1,28 @@ +package com.schisandra.oss.application.oss.core.up.model; + + +import com.schisandra.oss.application.oss.core.up.constant.ApiDomain; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @description:上传客户端配置 + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:40 + */ +@Data +@Accessors(chain = true) +public class UpOssClientConfig { + + /** + * 默认的超时时间:30秒 + */ + private int timeout = 30; + /** + * 默认为自动识别接入点 + */ + private ApiDomain apiDomain = ApiDomain.ED_AUTO; + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/model/UpOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/model/UpOssConfig.java new file mode 100644 index 0000000..7b5cb23 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/up/model/UpOssConfig.java @@ -0,0 +1,35 @@ +package com.schisandra.oss.application.oss.core.up.model; + + +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; + +/** + * @description:上传配置 + * @param: + * @return: + * @author zlg + * @date: 2024/6/25 14:40 + */ +@Data +public class UpOssConfig { + + private String basePath; + private String bucketName; + private String userName; + private String password; + + private UpOssClientConfig clientConfig; + + /** + * 断点续传参数 + */ + private SliceConfig sliceConfig = new SliceConfig(); + + public void init() { + this.sliceConfig.init(); + basePath = OssPathUtil.valid(basePath); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/WangYiOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/WangYiOssClient.java new file mode 100644 index 0000000..a926855 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/WangYiOssClient.java @@ -0,0 +1 @@ +/** * $Id: WangYiOssClient.java,v 1.0 2022/3/4 9:49 PM chenmin Exp $ */ package com.schisandra.oss.application.oss.core.wangyi; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.netease.cloud.services.nos.NosClient; import com.netease.cloud.services.nos.model.*; import com.schisandra.oss.application.oss.constant.OssConstant; import com.schisandra.oss.application.oss.core.StandardOssClient; import com.schisandra.oss.application.oss.core.wangyi.model.WangYiOssConfig; import com.schisandra.oss.application.oss.model.DirectoryOssInfo; import com.schisandra.oss.application.oss.model.FileOssInfo; import com.schisandra.oss.application.oss.model.OssInfo; import com.schisandra.oss.application.oss.model.SliceConfig; import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; import com.schisandra.oss.application.oss.model.upload.*; import com.schisandra.oss.application.oss.utils.OssPathUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.util.*; import java.util.stream.Collectors; /** * @description:网易配置 * @param: * @return: * @author zlg * @date: 2024/6/25 15:01 */ @Slf4j @Data @AllArgsConstructor @NoArgsConstructor public class WangYiOssClient implements StandardOssClient { public static final String NOS_OBJECT_NAME = "nosClient"; private NosClient nosClient; private WangYiOssConfig wangYiOssConfig; @Override public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { String bucket = getBucket(); String key = getKey(targetName, false); if (isOverride || !nosClient.doesObjectExist(bucket, key, null)) { nosClient.putObject(bucket, key, is, null); } return getInfo(targetName); } @Override public OssInfo upLoadCheckPoint(File file, String targetName) { return uploadFile(file, targetName, wangYiOssConfig.getSliceConfig(), OssConstant.OssType.WANGYI); } @Override public void completeUpload(UpLoadCheckPoint upLoadCheckPoint, List partEntityTags) { List eTags = partEntityTags.stream().sorted(Comparator.comparingInt(UpLoadPartEntityTag::getPartNumber)) .map(partEntityTag -> new PartETag(partEntityTag.getPartNumber(), partEntityTag.getETag())).collect(Collectors.toList()); CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(upLoadCheckPoint.getBucket(), upLoadCheckPoint.getKey(), upLoadCheckPoint.getUploadId(), eTags); nosClient.completeMultipartUpload(completeMultipartUploadRequest); FileUtil.del(upLoadCheckPoint.getCheckpointFile()); } @Override public void prepareUpload(UpLoadCheckPoint uploadCheckPoint, File upLoadFile, String targetName, String checkpointFile, SliceConfig slice) { String bucket = getBucket(); String key = getKey(targetName, false); uploadCheckPoint.setMagic(UpLoadCheckPoint.UPLOAD_MAGIC); uploadCheckPoint.setUploadFile(upLoadFile.getPath()); uploadCheckPoint.setKey(key); uploadCheckPoint.setBucket(bucket); uploadCheckPoint.setCheckpointFile(checkpointFile); uploadCheckPoint.setUploadFileStat(UpLoadFileStat.getFileStat(uploadCheckPoint.getUploadFile())); long partSize = slice.getPartSize(); long fileLength = upLoadFile.length(); int parts = (int) (fileLength / partSize); if (fileLength % partSize > 0) { parts++; } uploadCheckPoint.setUploadParts(splitUploadFile(uploadCheckPoint.getUploadFileStat().getSize(), partSize)); uploadCheckPoint.setPartEntityTags(new ArrayList<>()); uploadCheckPoint.setOriginPartSize(parts); InitiateMultipartUploadResult initiateMultipartUploadResult = nosClient.initiateMultipartUpload(new InitiateMultipartUploadRequest(bucket, key)); uploadCheckPoint.setUploadId(initiateMultipartUploadResult.getUploadId()); } @Override public UpLoadPartResult uploadPart(UpLoadCheckPoint upLoadCheckPoint, int partNum, InputStream inputStream) { UploadPart uploadPart = upLoadCheckPoint.getUploadParts().get(partNum); long partSize = uploadPart.getSize(); UpLoadPartResult partResult = new UpLoadPartResult(partNum + 1, uploadPart.getOffset(), partSize); try { inputStream.skip(uploadPart.getOffset()); UploadPartRequest uploadPartRequest = new UploadPartRequest(); uploadPartRequest.setBucketName(upLoadCheckPoint.getBucket()); uploadPartRequest.setKey(upLoadCheckPoint.getKey()); uploadPartRequest.setUploadId(upLoadCheckPoint.getUploadId()); uploadPartRequest.setInputStream(inputStream); uploadPartRequest.setPartSize(partSize); uploadPartRequest.setPartNumber(partNum + 1); UploadPartResult uploadPartResult = nosClient.uploadPart(uploadPartRequest); partResult.setNumber(uploadPartResult.getPartNumber()); PartETag eTag = uploadPartResult.getPartETag(); partResult.setEntityTag(new UpLoadPartEntityTag().setETag(eTag.getETag()).setPartNumber(eTag.getPartNumber())); } catch (Exception e) { partResult.setFailed(true); partResult.setException(e); } finally { IoUtil.close(inputStream); } return partResult; } @Override public void downLoad(OutputStream os, String targetName) { NOSObject nosObject = nosClient.getObject(getBucket(), getKey(targetName, false)); IoUtil.copy(nosObject.getObjectContent(), os); } @Override public void downLoadCheckPoint(File localFile, String targetName) { downLoadFile(localFile, targetName, wangYiOssConfig.getSliceConfig(), OssConstant.OssType.WANGYI); } @Override public DownloadObjectStat getDownloadObjectStat(String targetName) { ObjectMetadata objectMetadata = nosClient.getObjectMetadata(getBucket(), getKey(targetName, false)); DateTime date = DateUtil.date(objectMetadata.getLastModified()); long contentLength = objectMetadata.getContentLength(); String eTag = objectMetadata.getETag(); return new DownloadObjectStat().setSize(contentLength).setLastModified(date).setDigest(eTag); } @Override public void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { downloadCheckPoint.setMagic(DownloadCheckPoint.DOWNLOAD_MAGIC); downloadCheckPoint.setDownloadFile(localFile.getPath()); downloadCheckPoint.setBucketName(getBucket()); downloadCheckPoint.setKey(getKey(targetName, false)); downloadCheckPoint.setCheckPointFile(checkpointFile); downloadCheckPoint.setObjectStat(getDownloadObjectStat(targetName)); long downloadSize; if (downloadCheckPoint.getObjectStat().getSize() > 0) { Long partSize = wangYiOssConfig.getSliceConfig().getPartSize(); long[] slice = getDownloadSlice(new long[0], downloadCheckPoint.getObjectStat().getSize()); downloadCheckPoint.setDownloadParts(splitDownloadFile(slice[0], slice[1], partSize)); downloadSize = slice[1]; } else { downloadSize = 0; downloadCheckPoint.setDownloadParts(splitDownloadOneFile()); } downloadCheckPoint.setOriginPartSize(downloadCheckPoint.getDownloadParts().size()); createDownloadTemp(downloadCheckPoint.getTempDownloadFile(), downloadSize); } @Override public InputStream downloadPart(String key, long start, long end) { GetObjectRequest request = new GetObjectRequest(getBucket(), key); request.setKey(key); request.setRange(start, end); NOSObject nosObject = nosClient.getObject(request); return nosObject.getObjectContent(); } @Override public void delete(String targetName) { nosClient.deleteObject(getBucket(), getKey(targetName, false)); } @Override public void copy(String sourceName, String targetName, Boolean isOverride) { String bucket = getBucket(); String newTargetName = getKey(targetName, false); if (isOverride || !nosClient.doesObjectExist(bucket, newTargetName, null)) { nosClient.copyObject(bucket, getKey(sourceName, false), bucket, newTargetName); } } @Override public OssInfo getInfo(String targetName, Boolean isRecursion) { String key = getKey(targetName, false); OssInfo ossInfo = getBaseInfo(key); ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); if (isRecursion && isDirectory(key)) { String prefix = OssPathUtil.convertPath(key, false); ListObjectsRequest listObjectsRequest = new ListObjectsRequest(); listObjectsRequest.setPrefix(prefix.endsWith(StrUtil.SLASH) ? prefix : prefix + StrUtil.SLASH); listObjectsRequest.setBucketName(getBucket()); ObjectListing objectListing = nosClient.listObjects(listObjectsRequest); List fileOssInfos = new ArrayList<>(); List directoryInfos = new ArrayList<>(); if (ObjectUtil.isNotEmpty(objectListing.getObjectSummaries())) { for (NOSObjectSummary nosObjectSummary : objectListing.getObjectSummaries()) { if (FileNameUtil.getName(nosObjectSummary.getKey()).equals(FileNameUtil.getName(key))) { ossInfo.setLastUpdateTime(DateUtil.date(nosObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); ossInfo.setCreateTime(DateUtil.date(nosObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); ossInfo.setLength(Convert.toStr(nosObjectSummary.getSize())); } else { fileOssInfos.add(getInfo(OssPathUtil.replaceKey(nosObjectSummary.getKey(), getBasePath(), false), false)); } } } if (ObjectUtil.isNotEmpty(objectListing.getCommonPrefixes())) { for (String commonPrefix : objectListing.getCommonPrefixes()) { String target = OssPathUtil.replaceKey(commonPrefix, getBasePath(), false); if (isDirectory(commonPrefix)) { directoryInfos.add(getInfo(target, true)); } else { fileOssInfos.add(getInfo(target, false)); } } } if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); } if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); } } return ossInfo; } @Override public Boolean isExist(String targetName) { return nosClient.doesObjectExist(getBucket(), getKey(targetName, false), null); } @Override public String getBasePath() { return wangYiOssConfig.getBasePath(); } @Override public Map getClientObject() { return new HashMap() { { put(NOS_OBJECT_NAME, getNosClient()); } }; } private String getBucket() { String bucketName = wangYiOssConfig.getBucketName(); if (!nosClient.doesBucketExist(bucketName)) { nosClient.createBucket(bucketName); } return bucketName; } public OssInfo getBaseInfo(String key) { OssInfo ossInfo; if (isFile(key)) { ossInfo = new FileOssInfo(); try { ObjectMetadata objectMetadata = nosClient.getObjectMetadata(getBucket(), key); ossInfo.setLastUpdateTime(DateUtil.date(objectMetadata.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); ossInfo.setCreateTime(DateUtil.date(objectMetadata.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); ossInfo.setLength(Convert.toStr(objectMetadata.getContentLength())); } catch (Exception e) { log.error("获取{}文件属性失败", key, e); } } else { ossInfo = new DirectoryOssInfo(); } return ossInfo; } } \ No newline at end of file diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/WangYiOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/WangYiOssConfiguration.java new file mode 100644 index 0000000..db8fdcb --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/WangYiOssConfiguration.java @@ -0,0 +1 @@ +/** * $Id: WangYiOssConfiguration.java,v 1.0 2022/3/4 9:49 PM chenmin Exp $ */ package com.schisandra.oss.application.oss.core.wangyi; import cn.hutool.core.util.ObjectUtil; import com.netease.cloud.auth.BasicCredentials; import com.netease.cloud.auth.Credentials; import com.netease.cloud.services.nos.NosClient; import com.schisandra.oss.application.convert.SchisandraOssWangyiDTOConverter; import com.schisandra.oss.application.dto.SchisandraOssWangyiDTO; import com.schisandra.oss.application.oss.core.StandardOssClient; import com.schisandra.oss.application.oss.core.wangyi.model.WangYiOssConfig; import com.schisandra.oss.domain.bo.SchisandraOssWangyiBO; import com.schisandra.oss.domain.service.SchisandraOssWangyiDomainService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * @author zlg * @description:网易配置 * @param: * @return: * @date: 2024/6/25 14:58 */ @Component @Slf4j public class WangYiOssConfiguration { @Resource private SchisandraOssWangyiDomainService schisandraOssWangyiDomainService; public StandardOssClient wangYiOssClient(String userId) { SchisandraOssWangyiBO schisandraOssWangyiBO = schisandraOssWangyiDomainService.getWangyiOssConfig(userId); SchisandraOssWangyiDTO schisandraOssWangyiDTO = SchisandraOssWangyiDTOConverter.INSTANCE.convertBOToDTO(schisandraOssWangyiBO); if (ObjectUtil.isEmpty(schisandraOssWangyiDTO)) { log.error("wangyi oss配置信息获取失败"); return null; } String endPoint = schisandraOssWangyiDTO.getEndpoint(); String accessKey = schisandraOssWangyiDTO.getAccessKey(); String secretKey = schisandraOssWangyiDTO.getSecretKey(); WangYiOssConfig wangYiOssConfig = new WangYiOssConfig(); wangYiOssConfig.setEndpoint(endPoint); wangYiOssConfig.setAccessKey(accessKey); wangYiOssConfig.setSecretKey(secretKey); return wangYiOssClient(wangYiOssConfig); } public StandardOssClient wangYiOssClient(WangYiOssConfig ossConfig) { return new WangYiOssClient(nosClient(ossConfig), ossConfig); } public NosClient nosClient(WangYiOssConfig ossConfig) { Credentials credentials = new BasicCredentials(ossConfig.getAccessKey(), ossConfig.getSecretKey()); NosClient nosClient = new NosClient(credentials); nosClient.setEndpoint(ossConfig.getEndpoint()); nosClient.setConfiguration(ossConfig.getClientConfig().toClientConfig()); return nosClient; } } \ No newline at end of file diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/model/WangYiOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/model/WangYiOssClientConfig.java new file mode 100644 index 0000000..06d8bab --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/model/WangYiOssClientConfig.java @@ -0,0 +1,81 @@ +package com.schisandra.oss.application.oss.core.wangyi.model; + +import cn.hutool.core.bean.BeanUtil; +import com.netease.cloud.ClientConfiguration; +import com.netease.cloud.Protocol; +import lombok.Data; +import lombok.experimental.Accessors; + +import static com.netease.cloud.ClientConfiguration.*; + + +@Data +@Accessors(chain = true) +public class WangYiOssClientConfig { + /** + * 连接超时时间 + */ + private int connectionTimeout = 50 * 1000; + /** + * 最大连接池大小。 + */ + private int maxConnections = DEFAULT_MAX_CONNECTIONS; + /** + * 最大失败重试次数 + */ + private int maxErrorRetry = DEFAULT_MAX_RETRIES; + /** + * 是否使用子域名 + */ + private boolean isSubDomain = true; + /** + * 连接OSS所采用的协议(HTTP或HTTPS),默认为HTTP。 + */ + private Protocol protocol = Protocol.HTTP; + /** + * 代理服务器的域,该域可以执行NTLM认证 + */ + private String proxyDomain; + /** + * 代理服务器主机地址 + */ + private String proxyHost; + /** + * 代理服务器验证的密码 + */ + private String proxyPassword; + /** + * 代理服务器端口 + */ + private int proxyPort = -1; + /** + * 代理服务器验证的用户名 + */ + private String proxyUsername; + /** + * 代理主机的NTLM身份验证服务器 + */ + private String proxyWorkstation; + /** + * Socket层传输数据的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + private int socketTimeout = DEFAULT_SOCKET_TIMEOUT; + /** + * 用户代理,指HTTP的User-Agent头 + */ + private String userAgent = DEFAULT_USER_AGENT; + /** + * Socket接收缓冲区的大小提示(以字节为单位)。 + */ + private int socketReceiveBufferSizeHint = 0; + /** + * Socket发送缓冲区的大小提示(以字节为单位)。 + */ + private int socketSendBufferSizeHint = 0; + + public ClientConfiguration toClientConfig() { + ClientConfiguration clientConfiguration = new ClientConfiguration(); + BeanUtil.copyProperties(this, clientConfiguration); + return clientConfiguration; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/model/WangYiOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/model/WangYiOssConfig.java new file mode 100644 index 0000000..dd591df --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/wangyi/model/WangYiOssConfig.java @@ -0,0 +1 @@ +/** * $Id: WangYiOssConfig.java,v 1.0 2022/3/4 9:54 PM chenmin Exp $ */ package com.schisandra.oss.application.oss.core.wangyi.model; import com.schisandra.oss.application.oss.model.SliceConfig; import com.schisandra.oss.application.oss.utils.OssPathUtil; import lombok.Data; @Data public class WangYiOssConfig { private String accessKey; private String secretKey; private String endpoint; private String bucketName; private String basePath; private WangYiOssClientConfig clientConfig; /** * 断点续传参数 */ private SliceConfig sliceConfig = new SliceConfig(); public void init() { this.sliceConfig.init(); basePath = OssPathUtil.valid(basePath); } } \ No newline at end of file diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml index 5f31090..021ba67 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml @@ -57,6 +57,8 @@ spring-boot-starter-log4j2 2.4.2 + + com.alibaba fastjson @@ -149,6 +151,65 @@ aws-java-sdk-s3 1.12.167 + + + com.ksyun + ks3-kss-java-sdk + 1.0.2 + + + commons-logging + commons-logging + + + + + + com.yunify + qingstor.sdk.java + 2.5.2 + + + + + + com.qcloud + cos_api + 5.6.69 + + + + + com.qiniu + qiniu-java-sdk + 7.9.3 + + + com.qiniu + happy-dns-java + 0.1.6 + + + + + cn.ucloud.ufile + ufile-client-java + 2.6.6 + + + + + com.upyun + java-sdk + 4.2.3 + + + + com.netease.cloud + nos-sdk-java-publiccloud + 1.3.1 + + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssJinshanDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssJinshanDomainService.java index eb60962..5be79b3 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssJinshanDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssJinshanDomainService.java @@ -25,4 +25,13 @@ public interface SchisandraOssJinshanDomainService { */ Boolean delete(SchisandraOssJinshanBO schisandraOssJinshanBO); + /** + * @description:获取 金山云对象存储配置表 信息 + * @param: [userId] + * @return: com.schisandra.oss.domain.bo.SchisandraOssJinshanBO + * @author zlg + * @date: 2024/6/25 14:35 + */ + SchisandraOssJinshanBO getJinshanOssConfig(String userId); + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssQingyunDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssQingyunDomainService.java index f738d86..af7cd00 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssQingyunDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssQingyunDomainService.java @@ -24,5 +24,12 @@ public interface SchisandraOssQingyunDomainService { * 删除 青云对象存储配置表 信息 */ Boolean delete(SchisandraOssQingyunBO schisandraOssQingyunBO); - + /** + * @description: 获取 青云对象存储配置表 信息 + * @param: [ossConfigId] + * @return: com.schisandra.oss.domain.bo.SchisandraOssQingyunBO + * @author zlg + * @date: 2024/6/25 14:35 + */ + SchisandraOssQingyunBO getQingyunOssConfig(String ossConfigId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssQiniuDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssQiniuDomainService.java index d35ee03..2eea10a 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssQiniuDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssQiniuDomainService.java @@ -24,5 +24,12 @@ public interface SchisandraOssQiniuDomainService { * 删除 七牛云对象存储配置表 信息 */ Boolean delete(SchisandraOssQiniuBO schisandraOssQiniuBO); - + /** + * @description: 获取七牛云对象存储配置表信息 + * @param: [userId] + * @return: com.schisandra.oss.domain.bo.SchisandraOssQiniuBO + * @author zlg + * @date: 2024/6/25 14:34 + */ + SchisandraOssQiniuBO getQiniuOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssTencentDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssTencentDomainService.java index 890b79e..c872c52 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssTencentDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssTencentDomainService.java @@ -24,5 +24,12 @@ public interface SchisandraOssTencentDomainService { * 删除 腾讯云对象存储配置表 信息 */ Boolean delete(SchisandraOssTencentBO schisandraOssTencentBO); - + /** + * @description: 获取腾讯云对象存储配置表 信息 + * @param: [id] + * @return: com.schisandra.oss.domain.bo.SchisandraOssTencentBO + * @author zlg + * @date: 2024/6/25 14:34 + */ + SchisandraOssTencentBO getTencentOssConfig(String id); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssUcloudDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssUcloudDomainService.java index 873b8fc..afd24fe 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssUcloudDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssUcloudDomainService.java @@ -25,4 +25,12 @@ public interface SchisandraOssUcloudDomainService { */ Boolean delete(SchisandraOssUcloudBO schisandraOssUcloudBO); + /** + * @description: 获取ucloud对象存储配置表信息 + * @param: [userId] + * @return: com.schisandra.oss.domain.bo.SchisandraOssUcloudBO + * @author zlg + * @date: 2024/6/25 14:34 + */ + SchisandraOssUcloudBO getUcloudOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssUpDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssUpDomainService.java index bd7c6bd..0cab08d 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssUpDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssUpDomainService.java @@ -25,4 +25,5 @@ public interface SchisandraOssUpDomainService { */ Boolean delete(SchisandraOssUpBO schisandraOssUpBO); + SchisandraOssUpBO getUpOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssWangyiDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssWangyiDomainService.java index 04c54b1..1f48888 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssWangyiDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssWangyiDomainService.java @@ -25,4 +25,13 @@ public interface SchisandraOssWangyiDomainService { */ Boolean delete(SchisandraOssWangyiBO schisandraOssWangyiBO); + /** + * @description:获取网易数帆对象存储配置表 信息 + * @param: [userId] + * @return: com.schisandra.oss.domain.bo.SchisandraOssWangyiBO + * @author zlg + * @date: 2024/6/25 15:03 + */ + SchisandraOssWangyiBO getWangyiOssConfig(String userId); + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssJinshanDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssJinshanDomainServiceImpl.java index 81a2a8c..6ae5693 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssJinshanDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssJinshanDomainServiceImpl.java @@ -1,9 +1,12 @@ package com.schisandra.oss.domain.service.impl; import com.schisandra.oss.common.enums.IsDeletedFlagEnum; +import com.schisandra.oss.domain.bo.SchisandraOssJdBO; +import com.schisandra.oss.domain.convert.SchisandraOssJdBOConverter; import com.schisandra.oss.domain.convert.SchisandraOssJinshanBOConverter; import com.schisandra.oss.domain.bo.SchisandraOssJinshanBO; import com.schisandra.oss.domain.service.SchisandraOssJinshanDomainService; +import com.schisandra.oss.infra.basic.entity.SchisandraOssJd; import com.schisandra.oss.infra.basic.entity.SchisandraOssJinshan; import com.schisandra.oss.infra.basic.service.SchisandraOssJinshanService; import lombok.extern.slf4j.Slf4j; @@ -45,4 +48,11 @@ public class SchisandraOssJinshanDomainServiceImpl implements SchisandraOssJinsh return schisandraOssJinshanService.update(schisandraOssJinshan) > 0; } + @Override + public SchisandraOssJinshanBO getJinshanOssConfig(String userId) { + SchisandraOssJinshan schisandraOssJinshan = schisandraOssJinshanService.getJinshanOssConfig(userId); + SchisandraOssJinshanBO schisandraOssJinshanBO = SchisandraOssJinshanBOConverter.INSTANCE.convertEntityToBO(schisandraOssJinshan); + return schisandraOssJinshanBO; + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssQingyunDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssQingyunDomainServiceImpl.java index 60b2c96..2813cae 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssQingyunDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssQingyunDomainServiceImpl.java @@ -1,9 +1,12 @@ package com.schisandra.oss.domain.service.impl; import com.schisandra.oss.common.enums.IsDeletedFlagEnum; +import com.schisandra.oss.domain.bo.SchisandraOssJinshanBO; +import com.schisandra.oss.domain.convert.SchisandraOssJinshanBOConverter; import com.schisandra.oss.domain.convert.SchisandraOssQingyunBOConverter; import com.schisandra.oss.domain.bo.SchisandraOssQingyunBO; import com.schisandra.oss.domain.service.SchisandraOssQingyunDomainService; +import com.schisandra.oss.infra.basic.entity.SchisandraOssJinshan; import com.schisandra.oss.infra.basic.entity.SchisandraOssQingyun; import com.schisandra.oss.infra.basic.service.SchisandraOssQingyunService; import lombok.extern.slf4j.Slf4j; @@ -45,4 +48,11 @@ public class SchisandraOssQingyunDomainServiceImpl implements SchisandraOssQingy return schisandraOssQingyunService.update(schisandraOssQingyun) > 0; } + @Override + public SchisandraOssQingyunBO getQingyunOssConfig(String userId) { + SchisandraOssQingyun schisandraOssQingyun = schisandraOssQingyunService.getQingyunOssConfig(userId); + SchisandraOssQingyunBO schisandraOssQingyunBO = SchisandraOssQingyunBOConverter.INSTANCE.convertEntityToBO(schisandraOssQingyun); + return schisandraOssQingyunBO; + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssQiniuDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssQiniuDomainServiceImpl.java index 482bc60..2102c2a 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssQiniuDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssQiniuDomainServiceImpl.java @@ -1,9 +1,12 @@ package com.schisandra.oss.domain.service.impl; import com.schisandra.oss.common.enums.IsDeletedFlagEnum; +import com.schisandra.oss.domain.bo.SchisandraOssJdBO; +import com.schisandra.oss.domain.convert.SchisandraOssJdBOConverter; import com.schisandra.oss.domain.convert.SchisandraOssQiniuBOConverter; import com.schisandra.oss.domain.bo.SchisandraOssQiniuBO; import com.schisandra.oss.domain.service.SchisandraOssQiniuDomainService; +import com.schisandra.oss.infra.basic.entity.SchisandraOssJd; import com.schisandra.oss.infra.basic.entity.SchisandraOssQiniu; import com.schisandra.oss.infra.basic.service.SchisandraOssQiniuService; import lombok.extern.slf4j.Slf4j; @@ -45,4 +48,11 @@ public class SchisandraOssQiniuDomainServiceImpl implements SchisandraOssQiniuDo return schisandraOssQiniuService.update(schisandraOssQiniu) > 0; } + @Override + public SchisandraOssQiniuBO getQiniuOssConfig(String userId) { + SchisandraOssQiniu schisandraOssQiniu = schisandraOssQiniuService.getQiniuOssConfig(userId); + SchisandraOssQiniuBO schisandraOssQiniuBO = SchisandraOssQiniuBOConverter.INSTANCE.convertEntityToBO(schisandraOssQiniu); + return schisandraOssQiniuBO; + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssTencentDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssTencentDomainServiceImpl.java index 8f422c3..7a85e7f 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssTencentDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssTencentDomainServiceImpl.java @@ -1,9 +1,12 @@ package com.schisandra.oss.domain.service.impl; import com.schisandra.oss.common.enums.IsDeletedFlagEnum; +import com.schisandra.oss.domain.bo.SchisandraOssQiniuBO; +import com.schisandra.oss.domain.convert.SchisandraOssQiniuBOConverter; import com.schisandra.oss.domain.convert.SchisandraOssTencentBOConverter; import com.schisandra.oss.domain.bo.SchisandraOssTencentBO; import com.schisandra.oss.domain.service.SchisandraOssTencentDomainService; +import com.schisandra.oss.infra.basic.entity.SchisandraOssQiniu; import com.schisandra.oss.infra.basic.entity.SchisandraOssTencent; import com.schisandra.oss.infra.basic.service.SchisandraOssTencentService; import lombok.extern.slf4j.Slf4j; @@ -45,4 +48,12 @@ public class SchisandraOssTencentDomainServiceImpl implements SchisandraOssTence return schisandraOssTencentService.update(schisandraOssTencent) > 0; } + @Override + public SchisandraOssTencentBO getTencentOssConfig(String userId) { + SchisandraOssTencent schisandraOssTencent = schisandraOssTencentService.getTencentOssConfig(userId); + SchisandraOssTencentBO schisandraOssTencentBO = SchisandraOssTencentBOConverter.INSTANCE.convertEntityToBO(schisandraOssTencent); + return schisandraOssTencentBO; + } + + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssUcloudDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssUcloudDomainServiceImpl.java index 124a568..d59e5d4 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssUcloudDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssUcloudDomainServiceImpl.java @@ -1,9 +1,12 @@ package com.schisandra.oss.domain.service.impl; import com.schisandra.oss.common.enums.IsDeletedFlagEnum; +import com.schisandra.oss.domain.bo.SchisandraOssTencentBO; +import com.schisandra.oss.domain.convert.SchisandraOssTencentBOConverter; import com.schisandra.oss.domain.convert.SchisandraOssUcloudBOConverter; import com.schisandra.oss.domain.bo.SchisandraOssUcloudBO; import com.schisandra.oss.domain.service.SchisandraOssUcloudDomainService; +import com.schisandra.oss.infra.basic.entity.SchisandraOssTencent; import com.schisandra.oss.infra.basic.entity.SchisandraOssUcloud; import com.schisandra.oss.infra.basic.service.SchisandraOssUcloudService; import lombok.extern.slf4j.Slf4j; @@ -45,4 +48,11 @@ public class SchisandraOssUcloudDomainServiceImpl implements SchisandraOssUcloud return schisandraOssUcloudService.update(schisandraOssUcloud) > 0; } + @Override + public SchisandraOssUcloudBO getUcloudOssConfig(String userId) { + SchisandraOssUcloud schisandraOssUcloud = schisandraOssUcloudService.getUcloudOssConfig(userId); + SchisandraOssUcloudBO schisandraOssUcloudBO = SchisandraOssUcloudBOConverter.INSTANCE.convertEntityToBO(schisandraOssUcloud); + return schisandraOssUcloudBO; + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssUpDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssUpDomainServiceImpl.java index 31ad924..66b4849 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssUpDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssUpDomainServiceImpl.java @@ -45,4 +45,10 @@ public class SchisandraOssUpDomainServiceImpl implements SchisandraOssUpDomainSe return schisandraOssUpService.update(schisandraOssUp) > 0; } + @Override + public SchisandraOssUpBO getUpOssConfig(String userId) { + SchisandraOssUp schisandraOssUp=schisandraOssUpService.getUpOssConfig(userId); + return SchisandraOssUpBOConverter.INSTANCE.convertEntityToBO(schisandraOssUp); + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssWangyiDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssWangyiDomainServiceImpl.java index e4fec75..bfd3f46 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssWangyiDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssWangyiDomainServiceImpl.java @@ -45,4 +45,10 @@ public class SchisandraOssWangyiDomainServiceImpl implements SchisandraOssWangyi return schisandraOssWangyiService.update(schisandraOssWangyi) > 0; } + @Override + public SchisandraOssWangyiBO getWangyiOssConfig(String userId) { + SchisandraOssWangyi schisandraOssWangyi=schisandraOssWangyiService.getWangyiOssConfig(userId); + return SchisandraOssWangyiBOConverter.INSTANCE.convertEntityToBO(schisandraOssWangyi); + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssJinshanService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssJinshanService.java index 804e8ff..aeff01b 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssJinshanService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssJinshanService.java @@ -1,5 +1,6 @@ package com.schisandra.oss.infra.basic.service; +import com.schisandra.oss.infra.basic.entity.SchisandraOssJd; import com.schisandra.oss.infra.basic.entity.SchisandraOssJinshan; /** @@ -43,4 +44,5 @@ public interface SchisandraOssJinshanService { boolean deleteById(Long id); + SchisandraOssJinshan getJinshanOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssQingyunService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssQingyunService.java index b253bca..6dd8623 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssQingyunService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssQingyunService.java @@ -41,6 +41,13 @@ public interface SchisandraOssQingyunService { * @return 是否成功 */ boolean deleteById(Long id); - + /** + * @description: 获取用户配置信息 + * @param: [userId] + * @return: com.schisandra.oss.infra.basic.entity.SchisandraOssQingyun + * @author zlg + * @date: 2024/6/25 14:33 + */ + SchisandraOssQingyun getQingyunOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssQiniuService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssQiniuService.java index 0a9ebdc..a3f48a4 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssQiniuService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssQiniuService.java @@ -42,5 +42,13 @@ public interface SchisandraOssQiniuService { */ boolean deleteById(Long id); + /** + * @description:根据用户ID查询七牛云对象存储配置表 + * @param: [userId] + * @return: com.schisandra.oss.infra.basic.entity.SchisandraOssQiniu + * @author zlg + * @date: 2024/6/25 14:33 + */ + SchisandraOssQiniu getQiniuOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssTencentService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssTencentService.java index 8a0bae2..587478b 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssTencentService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssTencentService.java @@ -42,5 +42,13 @@ public interface SchisandraOssTencentService { */ boolean deleteById(Long id); + /** + * @description:获取腾讯云对象存储配置表 + * @param: [userId] + * @return: com.schisandra.oss.infra.basic.entity.SchisandraOssTencent + * @author zlg + * @date: 2024/6/25 14:33 + */ + SchisandraOssTencent getTencentOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssUcloudService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssUcloudService.java index 0d1a3a7..ecb87bb 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssUcloudService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssUcloudService.java @@ -41,6 +41,13 @@ public interface SchisandraOssUcloudService { * @return 是否成功 */ boolean deleteById(Long id); - + /** + * @description:根据用户id获取ucloud配置信息 + * @param: [userId] + * @return: com.schisandra.oss.infra.basic.entity.SchisandraOssUcloud + * @author zlg + * @date: 2024/6/25 14:33 + */ + SchisandraOssUcloud getUcloudOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssUpService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssUpService.java index 813def7..5faa88f 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssUpService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssUpService.java @@ -42,5 +42,5 @@ public interface SchisandraOssUpService { */ boolean deleteById(Long id); - + SchisandraOssUp getUpOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssWangyiService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssWangyiService.java index e9e8bd0..ac7dc06 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssWangyiService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssWangyiService.java @@ -42,5 +42,5 @@ public interface SchisandraOssWangyiService { */ boolean deleteById(Long id); - + SchisandraOssWangyi getWangyiOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssJinshanServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssJinshanServiceImpl.java index 87f57c1..1bb5f31 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssJinshanServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssJinshanServiceImpl.java @@ -2,6 +2,8 @@ package com.schisandra.oss.infra.basic.service.impl; import com.schisandra.oss.infra.basic.entity.SchisandraOssJinshan; import com.schisandra.oss.infra.basic.dao.SchisandraOssJinshanDao; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssJdTableDef; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssJinshanTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssJinshanService; import org.springframework.stereotype.Service; @@ -63,5 +65,10 @@ public class SchisandraOssJinshanServiceImpl implements SchisandraOssJinshanServ return this.schisandraOssJinshanDao.deleteById(id) > 0; } + @Override + public SchisandraOssJinshan getJinshanOssConfig(String userId) { + return schisandraOssJinshanDao.selectOneByCondition(SchisandraOssJinshanTableDef.SCHISANDRA_OSS_JINSHAN.USER_ID.eq(userId)); + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssQingyunServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssQingyunServiceImpl.java index 42ed530..0536ece 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssQingyunServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssQingyunServiceImpl.java @@ -2,6 +2,7 @@ package com.schisandra.oss.infra.basic.service.impl; import com.schisandra.oss.infra.basic.entity.SchisandraOssQingyun; import com.schisandra.oss.infra.basic.dao.SchisandraOssQingyunDao; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssQingyunTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssQingyunService; import org.springframework.stereotype.Service; @@ -63,5 +64,10 @@ public class SchisandraOssQingyunServiceImpl implements SchisandraOssQingyunServ return this.schisandraOssQingyunDao.deleteById(id) > 0; } + @Override + public SchisandraOssQingyun getQingyunOssConfig(String userId) { + return schisandraOssQingyunDao.selectOneByCondition(SchisandraOssQingyunTableDef.SCHISANDRA_OSS_QINGYUN.USER_ID.eq(userId)); + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssQiniuServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssQiniuServiceImpl.java index 366d216..6017910 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssQiniuServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssQiniuServiceImpl.java @@ -2,6 +2,7 @@ package com.schisandra.oss.infra.basic.service.impl; import com.schisandra.oss.infra.basic.entity.SchisandraOssQiniu; import com.schisandra.oss.infra.basic.dao.SchisandraOssQiniuDao; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssQiniuTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssQiniuService; import org.springframework.stereotype.Service; @@ -63,5 +64,11 @@ public class SchisandraOssQiniuServiceImpl implements SchisandraOssQiniuService return this.schisandraOssQiniuDao.deleteById(id) > 0; } + @Override + public SchisandraOssQiniu getQiniuOssConfig(String userId) { + return schisandraOssQiniuDao.selectOneByCondition(SchisandraOssQiniuTableDef.SCHISANDRA_OSS_QINIU.USER_ID.eq(userId)); + + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssTencentServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssTencentServiceImpl.java index 354e82c..411314f 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssTencentServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssTencentServiceImpl.java @@ -2,6 +2,8 @@ package com.schisandra.oss.infra.basic.service.impl; import com.schisandra.oss.infra.basic.dao.SchisandraOssTencentDao; import com.schisandra.oss.infra.basic.entity.SchisandraOssTencent; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssQiniuTableDef; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssTencentTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssTencentService; import org.springframework.stereotype.Service; @@ -63,5 +65,10 @@ public class SchisandraOssTencentServiceImpl implements SchisandraOssTencentServ return this.schisandraOssTencentDao.deleteById(id) > 0; } + @Override + public SchisandraOssTencent getTencentOssConfig(String userId) { + return schisandraOssTencentDao.selectOneByCondition(SchisandraOssTencentTableDef.SCHISANDRA_OSS_TENCENT.USER_ID.eq(userId)); + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssUcloudServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssUcloudServiceImpl.java index d029234..d646977 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssUcloudServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssUcloudServiceImpl.java @@ -2,6 +2,8 @@ package com.schisandra.oss.infra.basic.service.impl; import com.schisandra.oss.infra.basic.entity.SchisandraOssUcloud; import com.schisandra.oss.infra.basic.dao.SchisandraOssUcloudDao; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssTencentTableDef; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssUcloudTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssUcloudService; import org.springframework.stereotype.Service; @@ -64,4 +66,10 @@ public class SchisandraOssUcloudServiceImpl implements SchisandraOssUcloudServic } + @Override + public SchisandraOssUcloud getUcloudOssConfig(String userId) { + return schisandraOssUcloudDao.selectOneByCondition(SchisandraOssUcloudTableDef.SCHISANDRA_OSS_UCLOUD.USER_ID.eq(userId)); + } + + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssUpServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssUpServiceImpl.java index 7993448..4006264 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssUpServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssUpServiceImpl.java @@ -2,6 +2,7 @@ package com.schisandra.oss.infra.basic.service.impl; import com.schisandra.oss.infra.basic.entity.SchisandraOssUp; import com.schisandra.oss.infra.basic.dao.SchisandraOssUpDao; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssUpTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssUpService; import org.springframework.stereotype.Service; @@ -63,5 +64,12 @@ public class SchisandraOssUpServiceImpl implements SchisandraOssUpService { return this.schisandraOssUpDao.deleteById(id) > 0; } + @Override + public SchisandraOssUp getUpOssConfig(String userId) { + return schisandraOssUpDao.selectOneByCondition(SchisandraOssUpTableDef + .SCHISANDRA_OSS_UP.USER_ID.eq(userId)); + + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssWangyiServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssWangyiServiceImpl.java index d3eb034..00421f7 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssWangyiServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssWangyiServiceImpl.java @@ -2,6 +2,7 @@ package com.schisandra.oss.infra.basic.service.impl; import com.schisandra.oss.infra.basic.entity.SchisandraOssWangyi; import com.schisandra.oss.infra.basic.dao.SchisandraOssWangyiDao; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssWangyiTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssWangyiService; import org.springframework.stereotype.Service; @@ -63,5 +64,10 @@ public class SchisandraOssWangyiServiceImpl implements SchisandraOssWangyiServic return this.schisandraOssWangyiDao.deleteById(id) > 0; } + @Override + public SchisandraOssWangyi getWangyiOssConfig(String userId) { + return this.schisandraOssWangyiDao.selectOneByCondition(SchisandraOssWangyiTableDef.SCHISANDRA_OSS_WANGYI.USER_ID.eq(userId)); + } + }