From 71886cbbaee540b6f260894ed01e622735ee75b6 Mon Sep 17 00:00:00 2001 From: landaiqing <3517283258@qq.com> Date: Mon, 24 Jun 2024 16:19:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=AE=8C=E5=96=84oss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/SchisandraAuthUserDTO.java | 10 - .../auth/domain/bo/SchisandraAuthUserBO.java | 10 - .../SchisandraAuthUserDomainServiceImpl.java | 2 - .../basic/entity/SchisandraAuthUser.java | 20 +- .../config/EncryptFilterConfig.java | 38 --- .../oss/core/aws/AwsOssClient.java | 310 ++++++++++++++++++ .../oss/core/aws/AwsOssConfiguration.java | 79 +++++ .../oss/core/aws/constant/AwsRegion.java | 56 ++++ .../core/aws/model/AwsOssClientConfig.java | 22 ++ .../oss/core/aws/model/AwsOssConfig.java | 44 +++ .../oss/core/baidu/BaiduOssClient.java | 307 +++++++++++++++++ .../oss/core/baidu/BaiduOssConfiguration.java | 63 ++++ .../core/baidu/constant/BaiduOssConstant.java | 10 + .../baidu/model/BaiduOssClientConfig.java | 140 ++++++++ .../oss/core/baidu/model/BaiduOssConfig.java | 35 ++ .../oss/core/ftp/FtpOssClient.java | 283 ++++++++++++++++ .../oss/core/ftp/FtpOssConfiguration.java | 57 ++++ .../core/ftp/model/FtpOssClientConfig.java | 40 +++ .../oss/core/ftp/model/FtpOssConfig.java | 59 ++++ .../pom.xml | 20 +- .../SchisandraOssAwsDomainService.java | 1 + .../SchisandraOssBaiduDomainService.java | 1 + .../SchisandraOssFtpDomainService.java | 1 + .../SchisandraOssAwsDomainServiceImpl.java | 9 +- .../SchisandraOssBaiduDomainServiceImpl.java | 9 +- .../SchisandraOssFtpDomainServiceImpl.java | 9 +- .../service/SchisandraOssAwsService.java | 1 + .../service/SchisandraOssBaiduService.java | 1 + .../service/SchisandraOssFtpService.java | 1 + .../impl/SchisandraOssAwsServiceImpl.java | 6 + .../impl/SchisandraOssBaiduServiceImpl.java | 12 +- .../impl/SchisandraOssFtpServiceImpl.java | 12 +- 32 files changed, 1575 insertions(+), 93 deletions(-) delete mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/config/EncryptFilterConfig.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/aws/AwsOssClient.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/aws/AwsOssConfiguration.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/aws/constant/AwsRegion.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/aws/model/AwsOssClientConfig.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/aws/model/AwsOssConfig.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/baidu/BaiduOssClient.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/baidu/BaiduOssConfiguration.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/baidu/constant/BaiduOssConstant.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/baidu/model/BaiduOssClientConfig.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/baidu/model/BaiduOssConfig.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ftp/FtpOssClient.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ftp/FtpOssConfiguration.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ftp/model/FtpOssClientConfig.java create mode 100644 schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ftp/model/FtpOssConfig.java diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/dto/SchisandraAuthUserDTO.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/dto/SchisandraAuthUserDTO.java index cb2fd5b..fbd4f46 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/dto/SchisandraAuthUserDTO.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/dto/SchisandraAuthUserDTO.java @@ -1,6 +1,5 @@ package com.schisandra.auth.application.dto; -import com.mybatisflex.annotation.Column; import lombok.Data; import java.io.Serializable; @@ -19,15 +18,6 @@ public class SchisandraAuthUserDTO implements Serializable { * id */ private Long id; - /** - * uuid - */ - private String uuid; - - /** - * source - */ - private String source; /** * 用户名 */ diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/bo/SchisandraAuthUserBO.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/bo/SchisandraAuthUserBO.java index fb4acb5..80f7f14 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/bo/SchisandraAuthUserBO.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/bo/SchisandraAuthUserBO.java @@ -1,6 +1,5 @@ package com.schisandra.auth.domain.bo; -import com.mybatisflex.annotation.Column; import lombok.Data; import java.io.Serializable; @@ -19,15 +18,6 @@ public class SchisandraAuthUserBO implements Serializable { * */ private Long id; - /** - * uuid - */ - private String uuid; - - /** - * source - */ - private String source; /** * */ diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthUserDomainServiceImpl.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthUserDomainServiceImpl.java index 546b308..303c53d 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthUserDomainServiceImpl.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthUserDomainServiceImpl.java @@ -7,7 +7,6 @@ import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.schisandra.auth.common.entity.Result; import com.schisandra.auth.common.enums.IsDeletedFlagEnum; -import com.schisandra.auth.common.enums.OauthType; import com.schisandra.auth.common.enums.UserRoleEnum; import com.schisandra.auth.common.redis.RedisUtil; import com.schisandra.auth.domain.bo.SchisandraAuthUserBO; @@ -95,7 +94,6 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo @Override public Boolean register(SchisandraAuthUserBO schisandraAuthUserBO) { SchisandraAuthUser authUser = SchisandraAuthUserBOConverter.INSTANCE.convertBOToEntity(schisandraAuthUserBO); - authUser.setSource(OauthType.SYSTEM.getType()); Boolean insert = schisandraAuthUserService.insert(authUser); if (insert) { SchisandraAuthUserRoleBO schisandraAuthUserRoleBO = new SchisandraAuthUserRoleBO(); diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/entity/SchisandraAuthUser.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/entity/SchisandraAuthUser.java index 5e9611e..5e6ea0e 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/entity/SchisandraAuthUser.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/entity/SchisandraAuthUser.java @@ -1,11 +1,9 @@ package com.schisandra.auth.infra.basic.entity; -import com.mybatisflex.annotation.Column; -import com.mybatisflex.annotation.Id; -import com.mybatisflex.annotation.KeyType; -import com.mybatisflex.annotation.Table; +import com.mybatisflex.annotation.*; import com.mybatisflex.core.keygen.KeyGenerators; +import com.mybatisflex.core.mask.Masks; import lombok.Data; import java.io.Serializable; @@ -27,18 +25,6 @@ public class SchisandraAuthUser implements Serializable { @Id(keyType=KeyType.Generator, value= KeyGenerators.flexId) private Long id; - /** - * uuid - */ - @Column(value = "uuid") - private String uuid; - - /** - * source - */ - @Column(value = "source") - private String source; - @Column(value = "user_name") private String userName; @@ -59,12 +45,14 @@ public class SchisandraAuthUser implements Serializable { * */ @Column("phone") + @ColumnMask(Masks.FIXED_PHONE) private String phone; /** * */ @Column(value = "password") + @ColumnMask(Masks.PASSWORD) private String password; /** 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/config/EncryptFilterConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/config/EncryptFilterConfig.java deleted file mode 100644 index 91330f2..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/config/EncryptFilterConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.schisandra.oss.application.config; - -import com.cxytiandi.encrypt.core.EncryptionConfig; -import com.cxytiandi.encrypt.core.EncryptionFilter; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Arrays; -import java.util.Collections; - -/** - * @Classname EncryptFilterConfig - * @BelongsProject: schisandra-cloud-storage - * @BelongsPackage: com.schisandra.oss.application.config - * @Author: landaiqing - * @CreateTime: 2024-05-22 21:46 - * @Description: TODO - * @Version: 1.0 - */ -@Configuration -public class EncryptFilterConfig { - @Bean - public FilterRegistrationBean filterRegistration() { - EncryptionConfig config = new EncryptionConfig(); - config.setKey("d86d7bab3d6ac01ad9dc6a897652f2d2");//1.2版本及以下key 16位,1.2以上key 32位 - config.setRequestDecryptUriList(Collections.emptyList()); - config.setResponseCharset("UTF-8"); - config.setDebug(true); - config.setResponseEncryptUriList(Collections.singletonList("/oss/minio/getAllMinioInfo")); - FilterRegistrationBean registration = new FilterRegistrationBean(); - registration.setFilter(new EncryptionFilter(config)); - registration.addUrlPatterns("/*"); - registration.setName("EncryptionFilter"); - registration.setOrder(1); - return registration; - } -} 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/aws/AwsOssClient.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/aws/AwsOssClient.java new file mode 100644 index 0000000..a257813 --- /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/aws/AwsOssClient.java @@ -0,0 +1,310 @@ +package com.schisandra.oss.application.oss.core.aws; + +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.text.CharPool; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.aws.model.AwsOssConfig; +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 software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.*; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * https://docs.aws.amazon.com/s3/ + * @author 陈敏 + * @version AwsOssClient.java, v 1.0 2022/4/1 18:05 chenmin Exp $ + * Created on 2022/4/1 + */ +@Data +@Slf4j +@AllArgsConstructor +@NoArgsConstructor +public class AwsOssClient implements StandardOssClient { + + public static final String S3_OBJECT_NAME = "s3Client"; + + private S3Client s3Client; + private AwsOssConfig ossConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + String bucketName = getBucketName(); + String key = getKey(targetName, false); + + if (isOverride || !isExist(targetName)) { + try { + s3Client.putObject(builder -> builder + .bucket(bucketName) + .key(key), RequestBody.fromInputStream(is, is.available())); + } catch (IOException e) { + throw new OssException(e); + } + } + return getInfo(targetName); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + return uploadFile(file, targetName, ossConfig.getSliceConfig(), OssConstant.OssType.AWS); + } + + @Override + public void prepareUpload(UpLoadCheckPoint uploadCheckPoint, File upLoadFile, String targetName, String checkpointFile, SliceConfig slice) { + String bucketName = getBucketName(); + String key = getKey(targetName, false); + + uploadCheckPoint.setMagic(UpLoadCheckPoint.UPLOAD_MAGIC); + uploadCheckPoint.setUploadFile(upLoadFile.getPath()); + uploadCheckPoint.setKey(key); + uploadCheckPoint.setBucket(bucketName); + 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); + + CreateMultipartUploadResponse multipartUpload = s3Client.createMultipartUpload(builder -> builder.bucket(bucketName).key(key)); + + uploadCheckPoint.setUploadId(multipartUpload.uploadId()); + } + + @Override + public UpLoadPartResult uploadPart(UpLoadCheckPoint upLoadCheckPoint, int partNum, InputStream inputStream) { + UploadPart uploadPart = upLoadCheckPoint.getUploadParts().get(partNum); + long partSize = uploadPart.getSize(); + int partNumber = partNum + 1; + UpLoadPartResult partResult = new UpLoadPartResult(partNumber, uploadPart.getOffset(), partSize); + + try { + inputStream.skip(uploadPart.getOffset()); + UploadPartResponse uploadPartResponse = s3Client.uploadPart(builder -> builder.bucket(upLoadCheckPoint.getBucket()) + .key(upLoadCheckPoint.getKey()) + .uploadId(upLoadCheckPoint.getUploadId()) + .partNumber(partNumber) + .contentLength(partSize), + RequestBody.fromInputStream(inputStream, inputStream.available())); + + partResult.setNumber(partNumber); + partResult.setEntityTag(new UpLoadPartEntityTag().setETag(uploadPartResponse.eTag()).setPartNumber(partNumber)); + } catch (Exception e) { + partResult.setFailed(true); + partResult.setException(e); + } finally { + IoUtil.close(inputStream); + } + + return partResult; + } + + @Override + public void completeUpload(UpLoadCheckPoint upLoadCheckPoint, List partEntityTags) { + s3Client.completeMultipartUpload(builder -> builder + .bucket(upLoadCheckPoint.getBucket()) + .key(upLoadCheckPoint.getKey()) + .uploadId(upLoadCheckPoint.getUploadId())); + FileUtil.del(upLoadCheckPoint.getCheckpointFile()); + } + + @Override + public void downLoad(OutputStream os, String targetName) { + ResponseInputStream responseInputStream = s3Client.getObject(builder -> builder + .bucket(getBucketName()) + .key(getKey(targetName, false))); + IoUtil.copy(responseInputStream, os); + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + downLoadFile(localFile, targetName, ossConfig.getSliceConfig(), OssConstant.OssType.AWS); + } + + @Override + public void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { + downloadCheckPoint.setMagic(DownloadCheckPoint.DOWNLOAD_MAGIC); + downloadCheckPoint.setDownloadFile(localFile.getPath()); + downloadCheckPoint.setBucketName(getBucketName()); + downloadCheckPoint.setKey(getKey(targetName, false)); + downloadCheckPoint.setCheckPointFile(checkpointFile); + + downloadCheckPoint.setObjectStat(getDownloadObjectStat(targetName)); + + long downloadSize; + if (downloadCheckPoint.getObjectStat().getSize() > 0) { + Long partSize = ossConfig.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 DownloadObjectStat getDownloadObjectStat(String targetName) { + GetObjectAttributesResponse objectAttributes = s3Client.getObjectAttributes(builder -> builder + .key(getKey(targetName, false)) + .bucket(getBucketName())); + + DateTime date = DateUtil.date(objectAttributes.lastModified().getEpochSecond()); + long contentLength = objectAttributes.objectSize(); + String eTag = objectAttributes.eTag(); + return new DownloadObjectStat().setSize(contentLength).setLastModified(date).setDigest(eTag); + } + + @Override + public InputStream downloadPart(String key, long start, long end) throws Exception { + return s3Client.getObject(builder -> builder + .key(key) + .bucket(getBucketName()) + .range("bytes=" + start + "-" + end)); + } + + @Override + public void delete(String targetName) { + s3Client.deleteObject(builder -> builder.key(getKey(targetName, false)).bucket(getBucketName())); + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + String bucket = getBucketName(); + if (isOverride || !isExist(targetName)) { + s3Client.copyObject(builder -> builder + .sourceBucket(bucket) + .sourceKey(getKey(sourceName, false)) + .destinationBucket(bucket) + .destinationKey(getKey(targetName, 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); + ListObjectsResponse listObjects = s3Client.listObjects(builder -> builder.bucket(getBucketName()).prefix(prefix.endsWith("/") ? prefix : prefix + CharPool.SLASH)); + + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(listObjects.contents())) { + for (S3Object s3Object : listObjects.contents()) { + if (FileNameUtil.getName(s3Object.key()).equals(FileNameUtil.getName(key))) { + ossInfo.setLastUpdateTime(DateUtil.date(s3Object.lastModified().getEpochSecond()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(s3Object.lastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(s3Object.size())); + } else { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(s3Object.key(), getBasePath(), false), false)); + } + } + } + + if (ObjectUtil.isNotEmpty(listObjects.commonPrefixes())) { + for (CommonPrefix commonPrefix : listObjects.commonPrefixes()) { + String target = OssPathUtil.replaceKey(commonPrefix.prefix(), getBasePath(), false); + if (isDirectory(commonPrefix.prefix())) { + 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 Map getClientObject() { + return new HashMap() { + { + put(S3_OBJECT_NAME, getS3Client()); + } + }; + } + + @Override + public String getBasePath() { + return ossConfig.getBasePath(); + } + + public String getBucketName() { + return ossConfig.getBucketName(); + } + + public OssInfo getBaseInfo(String key) { + OssInfo ossInfo; + + if (isFile(key)) { + ossInfo = new FileOssInfo(); + try { + GetObjectAttributesResponse objectAttributes = s3Client.getObjectAttributes(builder -> builder + .key(key) + .bucket(getBucketName())); + + DateTime date = DateUtil.date(objectAttributes.lastModified().getEpochSecond()); + long contentLength = objectAttributes.objectSize(); + ossInfo.setLastUpdateTime(DateUtil.date(date).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(date).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(contentLength)); + } 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/aws/AwsOssConfiguration.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/aws/AwsOssConfiguration.java new file mode 100644 index 0000000..4ff15b6 --- /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/aws/AwsOssConfiguration.java @@ -0,0 +1,79 @@ +package com.schisandra.oss.application.oss.core.aws; + +import com.schisandra.oss.application.convert.SchisandraOssAwsDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssAwsDTO; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.aws.constant.AwsRegion; +import com.schisandra.oss.application.oss.core.aws.model.AwsOssClientConfig; +import com.schisandra.oss.application.oss.core.aws.model.AwsOssConfig; +import com.schisandra.oss.domain.bo.SchisandraOssAwsBO; +import com.schisandra.oss.domain.service.SchisandraOssAwsDomainService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Component; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; +import software.amazon.awssdk.services.s3.S3Client; + +import javax.annotation.Resource; + +/** + * @author 陈敏 + * @version AwsOssConfiguration.java, v 1.0 2022/4/1 18:02 chenmin Exp $ + * Created on 2022/4/1 + */ +@Component +@Slf4j +public class AwsOssConfiguration { + + @Resource + private SchisandraOssAwsDomainService schisandraOssAwsDomainService; + + public StandardOssClient awsOssClient(String userId) { + SchisandraOssAwsBO schisandraOssAwsBO = schisandraOssAwsDomainService.getAwsOssConfig(userId); + SchisandraOssAwsDTO schisandraOssAwsDTO = SchisandraOssAwsDTOConverter.INSTANCE.convertBOToDTO(schisandraOssAwsBO); + if (ObjectUtils.isEmpty(schisandraOssAwsDTO)) { + log.error("AWS oss配置信息获取失败"); + return null; + } + String accessKeyId = schisandraOssAwsDTO.getAccessKeyId(); + String secretAccessKey = schisandraOssAwsDTO.getSecretAccessKey(); + DefaultsMode mode = DefaultsMode.valueOf(schisandraOssAwsDTO.getMode()); + AwsRegion region = AwsRegion.valueOf(schisandraOssAwsDTO.getRegion()); + AwsOssConfig awsOssConfig = new AwsOssConfig(); + awsOssConfig.setAccessKeyId(accessKeyId); + awsOssConfig.setSecretAccessKey(secretAccessKey); + awsOssConfig.setMode(mode); + awsOssConfig.setRegion(region); + return awsOssClient(awsOssConfig); + } + + public StandardOssClient awsOssClient(AwsOssConfig ossConfig) { + return new AwsOssClient(s3Client(ossConfig), ossConfig); + } + + public S3Client s3Client(AwsOssConfig ossConfig) { + AwsOssClientConfig clientConfig = ossConfig.getClientConfig(); + return S3Client.builder().credentialsProvider(() -> new AwsCredentials() { + @Override + public String accessKeyId() { + return ossConfig.getAccessKeyId(); + } + + @Override + public String secretAccessKey() { + return ossConfig.getSecretAccessKey(); + } + }).region(ossConfig.getRegion().getRegion()) + .serviceConfiguration(builder -> builder + .accelerateModeEnabled(clientConfig.getAccelerateModeEnabled()) + .checksumValidationEnabled(clientConfig.getChecksumValidationEnabled()) + .multiRegionEnabled(clientConfig.getMultiRegionEnabled()) + .chunkedEncodingEnabled(clientConfig.getChunkedEncodingEnabled()) + .pathStyleAccessEnabled(clientConfig.getPathStyleAccessEnabled()) + .useArnRegionEnabled(clientConfig.getUseArnRegionEnabled()) + ) + .fipsEnabled(clientConfig.getFipsEnabled()) + .dualstackEnabled(clientConfig.getDualstackEnabled()).build(); + } +} 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/aws/constant/AwsRegion.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/aws/constant/AwsRegion.java new file mode 100644 index 0000000..c1a26f5 --- /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/aws/constant/AwsRegion.java @@ -0,0 +1,56 @@ +package com.schisandra.oss.application.oss.core.aws.constant; + +import software.amazon.awssdk.regions.Region; + +/** + * @author 陈敏 + * @version Region.java, v 1.0 2022/4/1 23:05 chenmin Exp $ + * Created on 2022/4/1 + */ +public enum AwsRegion { + + AP_SOUTH_1(Region.AP_SOUTH_1), + EU_SOUTH_1(Region.EU_SOUTH_1), + US_GOV_EAST_1(Region.US_GOV_EAST_1), + CA_CENTRAL_1(Region.CA_CENTRAL_1), + EU_CENTRAL_1(Region.EU_CENTRAL_1), + US_ISO_WEST_1(Region.US_ISO_WEST_1), + US_WEST_1(Region.US_WEST_1), + US_WEST_2(Region.US_WEST_2), + AF_SOUTH_1(Region.AF_SOUTH_1), + EU_NORTH_1(Region.EU_NORTH_1), + EU_WEST_3(Region.EU_WEST_3), + EU_WEST_2(Region.EU_WEST_2), + EU_WEST_1(Region.EU_WEST_1), + AP_NORTHEAST_3(Region.AP_NORTHEAST_3), + AP_NORTHEAST_2(Region.AP_NORTHEAST_2), + AP_NORTHEAST_1(Region.AP_NORTHEAST_1), + ME_SOUTH_1(Region.ME_SOUTH_1), + SA_EAST_1(Region.SA_EAST_1), + AP_EAST_1(Region.AP_EAST_1), + CN_NORTH_1(Region.CN_NORTH_1), + US_GOV_WEST_1(Region.US_GOV_WEST_1), + AP_SOUTHEAST_1(Region.AP_SOUTHEAST_1), + AP_SOUTHEAST_2(Region.AP_SOUTHEAST_2), + US_ISO_EAST_1(Region.US_ISO_EAST_1), + AP_SOUTHEAST_3(Region.AP_SOUTHEAST_3), + US_EAST_1(Region.US_EAST_1), + US_EAST_2(Region.US_EAST_2), + CN_NORTHWEST_1(Region.CN_NORTHWEST_1), + US_ISOB_EAST_1(Region.US_ISOB_EAST_1), + AWS_GLOBAL(Region.AWS_GLOBAL), + AWS_CN_GLOBAL(Region.AWS_CN_GLOBAL), + AWS_US_GOV_GLOBAL(Region.AWS_US_GOV_GLOBAL), + AWS_ISO_GLOBAL(Region.AWS_ISO_GLOBAL), + AWS_ISO_B_GLOBAL(Region.AWS_ISO_B_GLOBAL); + private final Region region; + + AwsRegion(Region region) { + this.region = region; + } + + public Region getRegion() { + return region; + } + +} 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/aws/model/AwsOssClientConfig.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/aws/model/AwsOssClientConfig.java new file mode 100644 index 0000000..a37e506 --- /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/aws/model/AwsOssClientConfig.java @@ -0,0 +1,22 @@ +package com.schisandra.oss.application.oss.core.aws.model; + +import lombok.Data; + +/** + * @author 陈敏 + * @version AwsOssClientConfig.java, v 1.0 2022/4/2 16:05 chenmin Exp $ + * Created on 2022/4/2 + */ +@Data +public class AwsOssClientConfig { + + private Boolean accelerateModeEnabled = false; + private Boolean checksumValidationEnabled = false; + private Boolean multiRegionEnabled = false; + private Boolean chunkedEncodingEnabled = false; + private Boolean pathStyleAccessEnabled = false; + private Boolean useArnRegionEnabled = false; + private Boolean fipsEnabled = false; + private Boolean dualstackEnabled = false; + +} 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/aws/model/AwsOssConfig.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/aws/model/AwsOssConfig.java new file mode 100644 index 0000000..79e8fd4 --- /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/aws/model/AwsOssConfig.java @@ -0,0 +1,44 @@ +package com.schisandra.oss.application.oss.core.aws.model; + + +import com.schisandra.oss.application.oss.core.aws.constant.AwsRegion; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; +import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; + +/** + * @author 陈敏 + * @version AwsOssConfig.java, v 1.0 2022/4/1 18:05 chenmin Exp $ + * Created on 2022/4/1 + */ +@Data +public class AwsOssConfig { + /** + * 数据存储路径 + */ + private String basePath; + /** + * Bucket名称 + */ + private String bucketName; + + private String accessKeyId; + + private String secretAccessKey; + + private AwsRegion region; + + private DefaultsMode mode; + + private AwsOssClientConfig 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/baidu/BaiduOssClient.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/baidu/BaiduOssClient.java new file mode 100644 index 0000000..4a51eec --- /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/baidu/BaiduOssClient.java @@ -0,0 +1,307 @@ +package com.schisandra.oss.application.oss.core.baidu; + +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.baidubce.services.bos.BosClient; +import com.baidubce.services.bos.model.*; +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.baidu.model.BaiduOssConfig; +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; + +/** + * https://cloud.baidu.com/doc/BOS/index.html + * + * @author 陈敏 + * @version BaiduOssClient.java, v 1.1 2021/11/24 15:34 chenmin Exp $ + * Created on 2021/11/24 + */ +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +public class BaiduOssClient implements StandardOssClient { + + public static final String BOS_OBJECT_NAME = "bosClient"; + + private BosClient bosClient; + private BaiduOssConfig baiduOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + String bucket = getBucket(); + String key = getKey(targetName, false); + if (isOverride || !bosClient.doesObjectExist(bucket, key)) { + bosClient.putObject(bucket, key, is); + } + return getInfo(targetName); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + return uploadFile(file, targetName, baiduOssConfig.getSliceConfig(), OssConstant.OssType.BAIDU); + } + + @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); + bosClient.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); + + InitiateMultipartUploadResponse initiateMultipartUploadResponse = + bosClient.initiateMultipartUpload(new InitiateMultipartUploadRequest(bucket, key)); + + uploadCheckPoint.setUploadId(initiateMultipartUploadResponse.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); + UploadPartResponse uploadPartResponse = bosClient.uploadPart(uploadPartRequest); + + partResult.setNumber(uploadPartResponse.getPartNumber()); + PartETag eTag = uploadPartResponse.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) { + BosObject bosObject = bosClient.getObject(getBucket(), getKey(targetName, false)); + IoUtil.copy(bosObject.getObjectContent(), os); + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + downLoadFile(localFile, targetName, baiduOssConfig.getSliceConfig(), OssConstant.OssType.BAIDU); + } + + @Override + public DownloadObjectStat getDownloadObjectStat(String targetName) { + ObjectMetadata objectMetadata = bosClient.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 = baiduOssConfig.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(); + request.setKey(key); + request.setBucketName(getBucket()); + request.setRange(start, end); + BosObject object = bosClient.getObject(request); + return object.getObjectContent(); + } + + @Override + public void delete(String targetName) { + bosClient.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 || !bosClient.doesObjectExist(bucket, newTargetName)) { + bosClient.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); + ListObjectsResponse listObjects = bosClient.listObjects(getBucket(), prefix.endsWith(StrUtil.SLASH) ? prefix : prefix + StrUtil.SLASH); + + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(listObjects.getContents())) { + for (BosObjectSummary bosObjectSummary : listObjects.getContents()) { + if (FileNameUtil.getName(bosObjectSummary.getKey()).equals(FileNameUtil.getName(key))) { + ossInfo.setLastUpdateTime(DateUtil.date(bosObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(bosObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(bosObjectSummary.getSize())); + } else { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(bosObjectSummary.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 bosClient.doesObjectExist(getBucket(), getKey(targetName, false)); + } + + @Override + public String getBasePath() { + return baiduOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(BOS_OBJECT_NAME, getBosClient()); + } + }; + } + + private String getBucket() { + String bucketName = baiduOssConfig.getBucketName(); + if (!bosClient.doesBucketExist(bucketName)) { + bosClient.createBucket(bucketName); + } + return bucketName; + } + + public OssInfo getBaseInfo(String key) { + OssInfo ossInfo; + + if (isFile(key)) { + ossInfo = new FileOssInfo(); + try { + ObjectMetadata objectMetadata = bosClient.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/baidu/BaiduOssConfiguration.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/baidu/BaiduOssConfiguration.java new file mode 100644 index 0000000..023e1c3 --- /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/baidu/BaiduOssConfiguration.java @@ -0,0 +1,63 @@ +package com.schisandra.oss.application.oss.core.baidu; + +import com.baidubce.auth.DefaultBceCredentials; +import com.baidubce.services.bos.BosClient; +import com.baidubce.services.bos.BosClientConfiguration; +import com.schisandra.oss.application.convert.SchisandraOssBaiduDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssBaiduDTO; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.baidu.model.BaiduOssClientConfig; +import com.schisandra.oss.application.oss.core.baidu.model.BaiduOssConfig; +import com.schisandra.oss.domain.bo.SchisandraOssBaiduBO; +import com.schisandra.oss.domain.service.SchisandraOssBaiduDomainService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Optional; + +/** + * @author 陈敏 + * @version BaiduConfiguration.java, v 1.1 2021/11/24 15:26 chenmin Exp $ + * Created on 2021/11/24 + */ +@Component +@Slf4j +public class BaiduOssConfiguration { + + @Resource + private SchisandraOssBaiduDomainService schisandraOssBaiduDomainService; + + + public StandardOssClient baiduOssClient(String userId) { + SchisandraOssBaiduBO schisandraOssBaiduBO = schisandraOssBaiduDomainService.getBaiduOssConfig(userId); + SchisandraOssBaiduDTO schisandraOssBaiduDTO = SchisandraOssBaiduDTOConverter.INSTANCE.convertBOToDTO(schisandraOssBaiduBO); + if (ObjectUtils.isEmpty(schisandraOssBaiduDTO)) { + log.error("Baidu oss配置信息获取失败"); + return null; + } + String accessKeyId = schisandraOssBaiduDTO.getAccessKeyId(); + String secretAccessKey = schisandraOssBaiduDTO.getSecretAccessKey(); + BaiduOssConfig baiduOssConfig = new BaiduOssConfig(); + baiduOssConfig.setAccessKeyId(accessKeyId); + baiduOssConfig.setSecretAccessKey(secretAccessKey); + return baiduOssClient(baiduOssConfig); + } + + public StandardOssClient baiduOssClient(BaiduOssConfig baiduOssConfig) { + return new BaiduOssClient(bosClient(bosClientConfiguration(baiduOssConfig)), baiduOssConfig); + } + + public BosClientConfiguration bosClientConfiguration(BaiduOssConfig baiduOssConfig) { + BaiduOssClientConfig clientConfig = Optional.ofNullable(baiduOssConfig.getClientConfig()).orElse(new BaiduOssClientConfig()); + BosClientConfiguration bosClientConfiguration = clientConfig.toClientConfig(); + bosClientConfiguration.setCredentials(new DefaultBceCredentials(baiduOssConfig.getAccessKeyId(), baiduOssConfig.getSecretAccessKey())); + return bosClientConfiguration; + } + + public BosClient bosClient(BosClientConfiguration config) { + return new BosClient(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/baidu/constant/BaiduOssConstant.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/baidu/constant/BaiduOssConstant.java new file mode 100644 index 0000000..12e23fb --- /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/baidu/constant/BaiduOssConstant.java @@ -0,0 +1,10 @@ +package com.schisandra.oss.application.oss.core.baidu.constant; + +/** + * @author 陈敏 + * @version BaiduOssConstant.java, v 1.0 2022/4/20 16:19 chenmin Exp $ + * Created on 2022/4/20 + */ +public class BaiduOssConstant { + public static final String DEFAULT_ENDPOINT = "bj.bcebos.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/baidu/model/BaiduOssClientConfig.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/baidu/model/BaiduOssClientConfig.java new file mode 100644 index 0000000..4b8ceae --- /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/baidu/model/BaiduOssClientConfig.java @@ -0,0 +1,140 @@ +package com.schisandra.oss.application.oss.core.baidu.model; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baidubce.BceClientConfiguration; +import com.baidubce.Protocol; +import com.baidubce.Region; +import com.baidubce.http.DefaultRetryPolicy; +import com.baidubce.http.RetryPolicy; +import com.baidubce.services.bos.BosClientConfiguration; +import com.schisandra.oss.application.oss.core.baidu.constant.BaiduOssConstant; +import lombok.Data; +import lombok.experimental.Accessors; +import lombok.extern.slf4j.Slf4j; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import static com.baidubce.BceClientConfiguration.*; +import static com.baidubce.services.bos.BosClientConfiguration.DEFAULT_STREAM_BUFFER_SIZE; + +/** + * @author 陈敏 + * @version BaiduOssClientConfig.java, v 1.0 2022/4/20 16:19 chenmin Exp $ + * Created on 2022/4/20 + */ +@Slf4j +@Data +@Accessors(chain = true) +public class BaiduOssClientConfig { + /** + * 使用cname访问BOS资源 + */ + private boolean cnameEnabled; + /** + * 异步put + */ + private boolean enableHttpAsyncPut = true; + /** + * 建立连接的超时时间(单位:毫秒) + */ + private int connectionTimeoutInMillis = DEFAULT_CONNECTION_TIMEOUT_IN_MILLIS; + /** + * 允许打开的最大HTTP连接数 + */ + private int maxConnections = DEFAULT_MAX_CONNECTIONS; + /** + * 连接协议类型 + */ + private Protocol protocol = DEFAULT_PROTOCOL; + /** + * 访问NTLM验证的代理服务器的Windows域名 + */ + private String proxyDomain; + /** + * 代理服务器主机地址 + */ + private String proxyHost; + /** + * 代理服务器验证的密码 + */ + private String proxyPassword; + /** + * 代理服务器端口 + */ + private int proxyPort = -1; + /** + * 代理服务器验证的用户名 + */ + private String proxyUsername; + /** + * NTLM代理服务器的Windows工作站名称 + */ + private String proxyWorkstation; + /** + * 是否设置用户代理认证 + */ + private boolean proxyPreemptiveAuthenticationEnabled; + /** + * 通过打开的连接传输数据的超时时间(单位:毫秒) + */ + private int socketTimeoutInMillis = DEFAULT_SOCKET_TIMEOUT_IN_MILLIS; + /** + * Socket缓冲区大小 + */ + private int socketBufferSizeInBytes = 0; + /** + * 访问域名 + */ + private String endpoint = BaiduOssConstant.DEFAULT_ENDPOINT; + /** + * 地域 + */ + private Region region = DEFAULT_REGION; + /** + * 是否开启HTTP重定向。默认开启 + */ + private boolean redirectsEnabled = true; + /** + * 本地地址 + */ + private String localAddress; + /** + * 请求失败最大重试次数 + */ + private int maxErrorRetry = RetryPolicy.DEFAULT_MAX_ERROR_RETRY; + /** + * 最大延迟时间,单位:毫秒 + */ + private long maxDelayInMillis = RetryPolicy.DEFAULT_MAX_DELAY_IN_MILLIS; + /** + * 流文件缓冲区大小 + */ + private int streamBufferSize = DEFAULT_STREAM_BUFFER_SIZE; + /** + * 用户代理,指HTTP的User-Agent头 + */ + private String userAgent = BceClientConfiguration.DEFAULT_USER_AGENT; + + public BosClientConfiguration toClientConfig() { + BosClientConfiguration clientConfig = new BosClientConfiguration(); + BeanUtil.copyProperties(this, clientConfig, "proxyPort", "socketBufferSizeInBytes", + "localAddress", "maxErrorRetry", "maxDelayInMillis"); + if (this.proxyPort != -1) { + clientConfig.setProxyPort(this.proxyPort); + } + if (this.socketBufferSizeInBytes != 0) { + clientConfig.setSocketBufferSizeInBytes(this.socketBufferSizeInBytes); + } + if (ObjectUtil.isNotEmpty(this.localAddress)) { + try { + clientConfig.setLocalAddress(InetAddress.getByName(this.localAddress)); + } catch (UnknownHostException e) { + log.error("localAddress配置有误,请检查!", e); + } + } + clientConfig.setRetryPolicy(new DefaultRetryPolicy(maxErrorRetry, maxDelayInMillis)); + 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/baidu/model/BaiduOssConfig.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/baidu/model/BaiduOssConfig.java new file mode 100644 index 0000000..d012d2a --- /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/baidu/model/BaiduOssConfig.java @@ -0,0 +1,35 @@ +package com.schisandra.oss.application.oss.core.baidu.model; + + +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +/** + * @author 陈敏 + * @version BaiduOssConfig.java, v 1.1 2022/2/19 18:25 chenmin Exp $ + * Created on 2022/2/19 + */ +@Slf4j +@Data +public class BaiduOssConfig { + + private String basePath; + private String bucketName; + private String accessKeyId; + private String secretAccessKey; + + private BaiduOssClientConfig 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/ftp/FtpOssClient.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/ftp/FtpOssClient.java new file mode 100644 index 0000000..3866da1 --- /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/ftp/FtpOssClient.java @@ -0,0 +1,283 @@ +package com.schisandra.oss.application.oss.core.ftp; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +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.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.ftp.Ftp; +import cn.hutool.extra.ftp.FtpMode; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.ftp.model.FtpOssClientConfig; +import com.schisandra.oss.application.oss.core.ftp.model.FtpOssConfig; +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 lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPFile; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author 陈敏 + * @version FtpOssClient.java, v 1.1 2021/11/15 11:11 chenmin Exp $ + * Created on 2021/11/15 + */ +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FtpOssClient implements StandardOssClient { + + public static final String FTP_OBJECT_NAME = "ftp"; + + private Ftp ftp; + private FtpOssConfig ftpOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + String key = getKey(targetName, true); + String parentPath = OssPathUtil.convertPath(Paths.get(key).getParent().toString(), true); + if (!ftp.exist(parentPath)) { + ftp.mkDirs(parentPath); + } + if (isOverride || !ftp.exist(key)) { + ftp.upload(parentPath, FileNameUtil.getName(targetName), is); + } + return getInfo(targetName); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + String key = getKey(targetName, true); + String fileName = FileNameUtil.getName(targetName); + FtpOssClientConfig clientConfig = ftpOssConfig.getClientConfig(); + Ftp ftp = new Ftp(ftpOssConfig.toFtpConfig(), FtpMode.Passive); + ftp.setBackToPwd(clientConfig.isBackToPwd()); + FTPClient ftpClient = ftp.getClient(); + InputStream inputStream = null; + try { + inputStream = FileUtil.getInputStream(file); + ftpClient.changeWorkingDirectory(OssPathUtil.convertPath(Paths.get(key).getParent().toString(), true)); + ftpClient.setBufferSize(1024); + ftpClient.setControlEncoding(StandardCharsets.UTF_8.name()); + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); + FTPFile[] files = ftpClient.listFiles(key); + if (files.length == 1) { + long remoteSize = files[0].getSize(); + long localSize = file.length(); + if (remoteSize == localSize) { + log.info("要上传的文件已存在"); + ftpClient.disconnect(); + } else if (remoteSize > localSize) { + log.info("软件中心的软件比即将上传的要大,无须上传或重新命名要上传的文件名"); + ftpClient.disconnect(); + } + if (inputStream.skip(remoteSize) == remoteSize) { + ftpClient.setRestartOffset(remoteSize); + boolean success = ftpClient.storeFile(new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1), inputStream); + if (success) { + log.info("文件断点续传成功"); + ftpClient.disconnect(); + } + } + } else { + boolean success = ftpClient.storeFile(new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1), inputStream); + log.info("文件上传" + success); + } + } catch (Exception e) { + throw new OssException(e); + } finally { + IoUtil.close(inputStream); + IoUtil.close(ftp); + } + return getInfo(targetName); + } + + @Override + public void downLoad(OutputStream os, String targetName) { + String key = getKey(targetName, true); + ftp.download(OssPathUtil.convertPath(Paths.get(key).getParent().toString(), true), key, os); + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + Ftp ftp = null; + OutputStream outputStream = null; + FtpOssClientConfig clientConfig = ftpOssConfig.getClientConfig(); + try { + ftp = new Ftp(ftpOssConfig.toFtpConfig(), FtpMode.Passive); + ftp.setBackToPwd(clientConfig.isBackToPwd()); + FTPClient ftpClient = ftp.getClient(); + ftpClient.enterLocalPassiveMode(); + + String key = getKey(targetName, true); + FTPFile[] ftpFiles = ftpClient.listFiles(key); + + if (ObjectUtil.isEmpty(ftpFiles)) { + log.warn("目标文件不存在,请检查!"); + return; + } + if (ftpFiles.length != 1) { + log.info("目标文件有多个,请检查!"); + return; + } + long remoteFileSize = ftpFiles[0].getSize(); + if (localFile.exists()) { + outputStream = new FileOutputStream(localFile, true); + long localFileSize = localFile.length(); + if (localFileSize >= remoteFileSize) { + log.info("本地文件大小大于远程文件大小,下载中止"); + return; + } + ftpClient.setRestartOffset(localFileSize); + ftpClient.retrieveFile(key, outputStream); + outputStream.close(); + } else { + outputStream = new FileOutputStream(localFile); + ftpClient.retrieveFile(key, outputStream); + outputStream.close(); + } + } catch (Exception e) { + throw new OssException(e); + } finally { + IoUtil.close(outputStream); + IoUtil.close(ftp); + } + } + + @Override + public void delete(String targetName) { + String key = getKey(targetName, true); + if (isDirectory(targetName)) { + ftp.delDir(key); + } else { + ftp.delFile(key); + } + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + log.warn("ftp协议不支持copy命令,暂不实现"); + } + + @Override + public void move(String sourceName, String targetName, Boolean isOverride) { + log.warn("ftp协议不支持move命令,暂不实现"); + } + + @Override + public void rename(String sourceName, String targetName, Boolean isOverride) { + String newSourceName = getKey(sourceName, true); + String newTargetName = getKey(targetName, true); + try { + if (isOverride || !isExist(newTargetName)) { + ftp.getClient().rename(newSourceName, newTargetName); + } + } catch (IOException e) { + log.error("{}重命名为{}失败,错误信息为:", newSourceName, newTargetName, e); + throw new OssException(e); + } + } + + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + String key = getKey(targetName, true); + OssInfo ossInfo = getBaseInfo(key); + if (isRecursion && ftp.isDir(key)) { + FTPFile[] ftpFiles = ftp.lsFiles(key); + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + for (FTPFile ftpFile : ftpFiles) { + if (ftpFile.isDirectory()) { + directoryInfos.add(getInfo(targetName + StrUtil.SLASH + ftpFile.getName(), true)); + } else { + fileOssInfos.add(getInfo(targetName + StrUtil.SLASH + ftpFile.getName(), false)); + } + } + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + return ossInfo; + } + + @Override + public Boolean isExist(String targetName) { + return ftp.exist(getKey(targetName, true)); + } + + @Override + public Boolean isFile(String targetName) { + return !isDirectory(targetName); + } + + @Override + public Boolean isDirectory(String targetName) { + return ftp.isDir(getKey(targetName, true)); + } + + @Override + public String getBasePath() { + return ftpOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(FTP_OBJECT_NAME, getFtp()); + } + }; + } + + private OssInfo getBaseInfo(String targetName) { + String name = FileNameUtil.getName(targetName); + String path = OssPathUtil.replaceKey(targetName, name, true); + FTPFile targetFtpFile = null; + OssInfo ossInfo; + if (ftp.isDir(targetName)) { + ossInfo = new DirectoryOssInfo(); + FTPFile[] ftpFiles = ftp.lsFiles(OssPathUtil.convertPath(Paths.get(targetName).getParent().toString(), true)); + for (FTPFile ftpFile : ftpFiles) { + if (ftpFile.getName().equals(name)) { + targetFtpFile = ftpFile; + break; + } + } + } else { + ossInfo = new FileOssInfo(); + FTPFile[] ftpFiles = ftp.lsFiles(targetName); + if (ArrayUtil.isNotEmpty(ftpFiles)) { + targetFtpFile = ftpFiles[0]; + } + } + if (ObjectUtil.isNotEmpty(targetFtpFile)) { + if (targetFtpFile.isFile()) { + ossInfo = new FileOssInfo(); + } + ossInfo.setName(name); + ossInfo.setPath(path); + ossInfo.setLength(Convert.toStr(targetFtpFile.getSize())); + ossInfo.setCreateTime(DateUtil.date(targetFtpFile.getTimestamp()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLastUpdateTime(DateUtil.date(targetFtpFile.getTimestamp()).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/ftp/FtpOssConfiguration.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/ftp/FtpOssConfiguration.java new file mode 100644 index 0000000..1ae85f6 --- /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/ftp/FtpOssConfiguration.java @@ -0,0 +1,57 @@ +package com.schisandra.oss.application.oss.core.ftp; + +import cn.hutool.extra.ftp.Ftp; +import com.schisandra.oss.application.convert.SchisandraOssFtpDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssFtpDTO; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.ftp.model.FtpOssClientConfig; +import com.schisandra.oss.application.oss.core.ftp.model.FtpOssConfig; +import com.schisandra.oss.domain.bo.SchisandraOssFtpBO; +import com.schisandra.oss.domain.service.SchisandraOssFtpDomainService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Optional; + +/** + * @author 陈敏 + * @version FtpOssConfiguration.java, v 1.1 2021/11/16 15:29 chenmin Exp $ + * Created on 2021/11/16 + */ +@Component +@Slf4j +public class FtpOssConfiguration { + + @Resource + private SchisandraOssFtpDomainService schisandraOssFtpDomainService; + + public StandardOssClient ftpOssClient(String userId) { + SchisandraOssFtpBO schisandraOssFtpBO = schisandraOssFtpDomainService.getFtpOssConfig(userId); + SchisandraOssFtpDTO schisandraOssFtpDTO = SchisandraOssFtpDTOConverter.INSTANCE.convertBOToDTO(schisandraOssFtpBO); + if (ObjectUtils.isEmpty(schisandraOssFtpDTO)) { + log.error("ftp oss配置信息获取失败"); + return null; + } + FtpOssConfig ftpOssConfig = new FtpOssConfig(); + ftpOssConfig.setUser(schisandraOssFtpDTO.getUser()); + ftpOssConfig.setHost(schisandraOssFtpDTO.getHost()); + ftpOssConfig.setPort(schisandraOssFtpDTO.getPort()); + ftpOssConfig.setPassword(schisandraOssFtpDTO.getPassword()); + ftpOssConfig.setBasePath(schisandraOssFtpDTO.getBasePath()); + return ftpOssClient(ftpOssConfig); + } + + public StandardOssClient ftpOssClient(FtpOssConfig ftpOssConfig) { + return new FtpOssClient(ftp(ftpOssConfig), ftpOssConfig); + } + + public Ftp ftp(FtpOssConfig ftpOssConfig) { + FtpOssClientConfig clientConfig = Optional.ofNullable(ftpOssConfig.getClientConfig()).orElse(new FtpOssClientConfig()); + Ftp ftp = new Ftp(ftpOssConfig.toFtpConfig(), clientConfig.getMode()); + ftp.setBackToPwd(clientConfig.isBackToPwd()); + return ftp; + } + +} 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/ftp/model/FtpOssClientConfig.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/ftp/model/FtpOssClientConfig.java new file mode 100644 index 0000000..59d266f --- /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/ftp/model/FtpOssClientConfig.java @@ -0,0 +1,40 @@ +package com.schisandra.oss.application.oss.core.ftp.model; + +import cn.hutool.extra.ftp.FtpMode; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author 陈敏 + * @version FtpOssClientConfig.java, v 1.0 2022/4/25 17:26 chenmin Exp $ + * Created on 2022/4/25 + */ +@Data +@Accessors(chain = true) +public class FtpOssClientConfig { + /** + * FTP连接模式,默认被动 + */ + private FtpMode mode = FtpMode.Passive; + /** + * 设置执行完操作是否返回当前目录,默认false + */ + private boolean backToPwd = false; + /** + * 连接超时时长,单位毫秒 + */ + private long connectionTimeout; + /** + * Socket连接超时时长,单位毫秒 + */ + private long soTimeout; + /** + * 设置服务器语言 + */ + private String serverLanguageCode; + /** + * 设置服务器系统关键词 + */ + private String systemKey; + +} 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/ftp/model/FtpOssConfig.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/ftp/model/FtpOssConfig.java new file mode 100644 index 0000000..ab74bae --- /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/ftp/model/FtpOssConfig.java @@ -0,0 +1,59 @@ +package com.schisandra.oss.application.oss.core.ftp.model; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.extra.ftp.FtpConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * @author 陈敏 + * @version FtpOssConfig.java, v 1.1 2022/2/19 18:29 chenmin Exp $ + * Created on 2022/2/19 + */ +@Slf4j +@Data +public class FtpOssConfig { + + private String basePath; + + /** + * 主机 + */ + private String host; + /** + * 端口 + */ + private int port; + /** + * 用户名 + */ + private String user; + /** + * 密码 + */ + private String password; + /** + * 编码 + */ + private Charset charset; + + private FtpOssClientConfig clientConfig; + + public void init() { + basePath = OssPathUtil.valid(basePath); + } + + public FtpConfig toFtpConfig() { + FtpConfig ftpConfig = new FtpConfig(); + BeanUtil.copyProperties(this, ftpConfig, + new CopyOptions().setIgnoreNullValue(true).setIgnoreProperties("basePath", "clientConfig")); + BeanUtil.copyProperties(this.getClientConfig(), ftpConfig, + new CopyOptions().setIgnoreNullValue(true).setIgnoreProperties("mode", "backToPwd")); + return ftpConfig; + } + +} 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 f858a86..d057318 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 @@ -106,30 +106,34 @@ 5.1.1 compile - + io.minio minio 8.2.1 - net.coobird thumbnailator 0.4.8 - + com.aliyun.oss aliyun-sdk-oss 3.14.0 - - + - com.cxytiandi - monkey-api-encrypt-core - 1.2.2.RELEASE + software.amazon.awssdk + s3 + 2.17.160 + + + + com.baidubce + bce-java-sdk + 0.10.196 diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssAwsDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssAwsDomainService.java index 9b78b47..b52b437 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssAwsDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssAwsDomainService.java @@ -25,4 +25,5 @@ public interface SchisandraOssAwsDomainService { */ Boolean delete(SchisandraOssAwsBO schisandraOssAwsBO); + SchisandraOssAwsBO getAwsOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssBaiduDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssBaiduDomainService.java index 4585a1b..5d7fe5a 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssBaiduDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssBaiduDomainService.java @@ -25,4 +25,5 @@ public interface SchisandraOssBaiduDomainService { */ Boolean delete(SchisandraOssBaiduBO schisandraOssBaiduBO); + SchisandraOssBaiduBO getBaiduOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssFtpDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssFtpDomainService.java index 5291687..a8af84d 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssFtpDomainService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssFtpDomainService.java @@ -25,4 +25,5 @@ public interface SchisandraOssFtpDomainService { */ Boolean delete(SchisandraOssFtpBO schisandraOssFtpBO); + SchisandraOssFtpBO getFtpOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssAwsDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssAwsDomainServiceImpl.java index c51ed65..36eb9d2 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssAwsDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssAwsDomainServiceImpl.java @@ -1,8 +1,8 @@ package com.schisandra.oss.domain.service.impl; import com.schisandra.oss.common.enums.IsDeletedFlagEnum; -import com.schisandra.oss.domain.convert.SchisandraOssAwsBOConverter; import com.schisandra.oss.domain.bo.SchisandraOssAwsBO; +import com.schisandra.oss.domain.convert.SchisandraOssAwsBOConverter; import com.schisandra.oss.domain.service.SchisandraOssAwsDomainService; import com.schisandra.oss.infra.basic.entity.SchisandraOssAws; import com.schisandra.oss.infra.basic.service.SchisandraOssAwsService; @@ -45,4 +45,11 @@ public class SchisandraOssAwsDomainServiceImpl implements SchisandraOssAwsDomain return schisandraOssAwsService.update(schisandraOssAws) > 0; } + @Override + public SchisandraOssAwsBO getAwsOssConfig(String userId) { + SchisandraOssAws awsOssConfig = schisandraOssAwsService.getAwsOssConfig(userId); + SchisandraOssAwsBO schisandraOssAwsBO = SchisandraOssAwsBOConverter.INSTANCE.convertEntityToBO(awsOssConfig); + return schisandraOssAwsBO; + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssBaiduDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssBaiduDomainServiceImpl.java index a5306b3..3e0e68e 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssBaiduDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssBaiduDomainServiceImpl.java @@ -1,8 +1,8 @@ package com.schisandra.oss.domain.service.impl; import com.schisandra.oss.common.enums.IsDeletedFlagEnum; -import com.schisandra.oss.domain.convert.SchisandraOssBaiduBOConverter; import com.schisandra.oss.domain.bo.SchisandraOssBaiduBO; +import com.schisandra.oss.domain.convert.SchisandraOssBaiduBOConverter; import com.schisandra.oss.domain.service.SchisandraOssBaiduDomainService; import com.schisandra.oss.infra.basic.entity.SchisandraOssBaidu; import com.schisandra.oss.infra.basic.service.SchisandraOssBaiduService; @@ -45,4 +45,11 @@ public class SchisandraOssBaiduDomainServiceImpl implements SchisandraOssBaiduDo return schisandraOssBaiduService.update(schisandraOssBaidu) > 0; } + @Override + public SchisandraOssBaiduBO getBaiduOssConfig(String userId) { + SchisandraOssBaidu schisandraOssBaidu = schisandraOssBaiduService.getBaiduOssConfig(userId); + SchisandraOssBaiduBO schisandraOssBaiduBO = SchisandraOssBaiduBOConverter.INSTANCE.convertEntityToBO(schisandraOssBaidu); + return schisandraOssBaiduBO; + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssFtpDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssFtpDomainServiceImpl.java index 80d57b5..c3cd824 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssFtpDomainServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssFtpDomainServiceImpl.java @@ -1,8 +1,8 @@ package com.schisandra.oss.domain.service.impl; import com.schisandra.oss.common.enums.IsDeletedFlagEnum; -import com.schisandra.oss.domain.convert.SchisandraOssFtpBOConverter; import com.schisandra.oss.domain.bo.SchisandraOssFtpBO; +import com.schisandra.oss.domain.convert.SchisandraOssFtpBOConverter; import com.schisandra.oss.domain.service.SchisandraOssFtpDomainService; import com.schisandra.oss.infra.basic.entity.SchisandraOssFtp; import com.schisandra.oss.infra.basic.service.SchisandraOssFtpService; @@ -45,4 +45,11 @@ public class SchisandraOssFtpDomainServiceImpl implements SchisandraOssFtpDomain return schisandraOssFtpService.update(schisandraOssFtp) > 0; } + @Override + public SchisandraOssFtpBO getFtpOssConfig(String userId) { + SchisandraOssFtp schisandraOssFtp = schisandraOssFtpService.getFtpOssConfig(userId); + SchisandraOssFtpBO schisandraOssFtpBO = SchisandraOssFtpBOConverter.INSTANCE.convertEntityToBO(schisandraOssFtp); + return schisandraOssFtpBO; + } + } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssAwsService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssAwsService.java index d41f981..7fb7011 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssAwsService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssAwsService.java @@ -43,4 +43,5 @@ public interface SchisandraOssAwsService { boolean deleteById(Long id); + SchisandraOssAws getAwsOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssBaiduService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssBaiduService.java index 294d16a..b957423 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssBaiduService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssBaiduService.java @@ -43,4 +43,5 @@ public interface SchisandraOssBaiduService { boolean deleteById(Long id); + SchisandraOssBaidu getBaiduOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssFtpService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssFtpService.java index 1629606..0558a8c 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssFtpService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssFtpService.java @@ -43,4 +43,5 @@ public interface SchisandraOssFtpService { boolean deleteById(Long id); + SchisandraOssFtp getFtpOssConfig(String userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssAwsServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssAwsServiceImpl.java index 475362d..250f33b 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssAwsServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssAwsServiceImpl.java @@ -2,6 +2,7 @@ package com.schisandra.oss.infra.basic.service.impl; import com.schisandra.oss.infra.basic.entity.SchisandraOssAws; import com.schisandra.oss.infra.basic.dao.SchisandraOssAwsDao; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssAwsTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssAwsService; import org.springframework.stereotype.Service; @@ -63,5 +64,10 @@ public class SchisandraOssAwsServiceImpl implements SchisandraOssAwsService { return this.schisandraOssAwsDao.deleteById(id) > 0; } + @Override + public SchisandraOssAws getAwsOssConfig(String userId) { + return schisandraOssAwsDao.selectOneByCondition(SchisandraOssAwsTableDef.SCHISANDRA_OSS_AWS.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/SchisandraOssBaiduServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssBaiduServiceImpl.java index 3ff5840..c726978 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssBaiduServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssBaiduServiceImpl.java @@ -1,7 +1,8 @@ package com.schisandra.oss.infra.basic.service.impl; -import com.schisandra.oss.infra.basic.entity.SchisandraOssBaidu; import com.schisandra.oss.infra.basic.dao.SchisandraOssBaiduDao; +import com.schisandra.oss.infra.basic.entity.SchisandraOssBaidu; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssBaiduTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssBaiduService; import org.springframework.stereotype.Service; @@ -38,7 +39,7 @@ public class SchisandraOssBaiduServiceImpl implements SchisandraOssBaiduService */ @Override public int insert(SchisandraOssBaidu schisandraOssBaidu) { - return this.schisandraOssBaiduDao.insert(schisandraOssBaidu,true); + return this.schisandraOssBaiduDao.insert(schisandraOssBaidu, true); } /** @@ -49,7 +50,7 @@ public class SchisandraOssBaiduServiceImpl implements SchisandraOssBaiduService */ @Override public int update(SchisandraOssBaidu schisandraOssBaidu) { - return this.schisandraOssBaiduDao.update(schisandraOssBaidu,true); + return this.schisandraOssBaiduDao.update(schisandraOssBaidu, true); } /** @@ -63,5 +64,10 @@ public class SchisandraOssBaiduServiceImpl implements SchisandraOssBaiduService return this.schisandraOssBaiduDao.deleteById(id) > 0; } + @Override + public SchisandraOssBaidu getBaiduOssConfig(String userId) { + return schisandraOssBaiduDao.selectOneByCondition(SchisandraOssBaiduTableDef.SCHISANDRA_OSS_BAIDU.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/SchisandraOssFtpServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssFtpServiceImpl.java index cb2165c..9931e63 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssFtpServiceImpl.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssFtpServiceImpl.java @@ -1,7 +1,8 @@ package com.schisandra.oss.infra.basic.service.impl; -import com.schisandra.oss.infra.basic.entity.SchisandraOssFtp; import com.schisandra.oss.infra.basic.dao.SchisandraOssFtpDao; +import com.schisandra.oss.infra.basic.entity.SchisandraOssFtp; +import com.schisandra.oss.infra.basic.entity.table.SchisandraOssFtpTableDef; import com.schisandra.oss.infra.basic.service.SchisandraOssFtpService; import org.springframework.stereotype.Service; @@ -38,7 +39,7 @@ public class SchisandraOssFtpServiceImpl implements SchisandraOssFtpService { */ @Override public int insert(SchisandraOssFtp schisandraOssFtp) { - return this.schisandraOssFtpDao.insert(schisandraOssFtp,true); + return this.schisandraOssFtpDao.insert(schisandraOssFtp, true); } /** @@ -49,7 +50,7 @@ public class SchisandraOssFtpServiceImpl implements SchisandraOssFtpService { */ @Override public int update(SchisandraOssFtp schisandraOssFtp) { - return this.schisandraOssFtpDao.update(schisandraOssFtp,true); + return this.schisandraOssFtpDao.update(schisandraOssFtp, true); } /** @@ -63,5 +64,10 @@ public class SchisandraOssFtpServiceImpl implements SchisandraOssFtpService { return this.schisandraOssFtpDao.deleteById(id) > 0; } + @Override + public SchisandraOssFtp getFtpOssConfig(String userId) { + return schisandraOssFtpDao.selectOneByCondition(SchisandraOssFtpTableDef.SCHISANDRA_OSS_FTP.USER_ID.eq(userId)); + } + }