feat: 添加完善oss

This commit is contained in:
landaiqing
2024-06-24 16:19:25 +08:00
parent 61e809ccce
commit 71886cbbae
32 changed files with 1575 additions and 93 deletions

View File

@@ -1,6 +1,5 @@
package com.schisandra.auth.application.dto; package com.schisandra.auth.application.dto;
import com.mybatisflex.annotation.Column;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
@@ -19,15 +18,6 @@ public class SchisandraAuthUserDTO implements Serializable {
* id * id
*/ */
private Long id; private Long id;
/**
* uuid
*/
private String uuid;
/**
* source
*/
private String source;
/** /**
* 用户名 * 用户名
*/ */

View File

@@ -1,6 +1,5 @@
package com.schisandra.auth.domain.bo; package com.schisandra.auth.domain.bo;
import com.mybatisflex.annotation.Column;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
@@ -19,15 +18,6 @@ public class SchisandraAuthUserBO implements Serializable {
* *
*/ */
private Long id; private Long id;
/**
* uuid
*/
private String uuid;
/**
* source
*/
private String source;
/** /**
* *
*/ */

View File

@@ -7,7 +7,6 @@ import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.schisandra.auth.common.entity.Result; import com.schisandra.auth.common.entity.Result;
import com.schisandra.auth.common.enums.IsDeletedFlagEnum; 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.enums.UserRoleEnum;
import com.schisandra.auth.common.redis.RedisUtil; import com.schisandra.auth.common.redis.RedisUtil;
import com.schisandra.auth.domain.bo.SchisandraAuthUserBO; import com.schisandra.auth.domain.bo.SchisandraAuthUserBO;
@@ -95,7 +94,6 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo
@Override @Override
public Boolean register(SchisandraAuthUserBO schisandraAuthUserBO) { public Boolean register(SchisandraAuthUserBO schisandraAuthUserBO) {
SchisandraAuthUser authUser = SchisandraAuthUserBOConverter.INSTANCE.convertBOToEntity(schisandraAuthUserBO); SchisandraAuthUser authUser = SchisandraAuthUserBOConverter.INSTANCE.convertBOToEntity(schisandraAuthUserBO);
authUser.setSource(OauthType.SYSTEM.getType());
Boolean insert = schisandraAuthUserService.insert(authUser); Boolean insert = schisandraAuthUserService.insert(authUser);
if (insert) { if (insert) {
SchisandraAuthUserRoleBO schisandraAuthUserRoleBO = new SchisandraAuthUserRoleBO(); SchisandraAuthUserRoleBO schisandraAuthUserRoleBO = new SchisandraAuthUserRoleBO();

View File

@@ -1,11 +1,9 @@
package com.schisandra.auth.infra.basic.entity; package com.schisandra.auth.infra.basic.entity;
import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.*;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import com.mybatisflex.core.keygen.KeyGenerators; import com.mybatisflex.core.keygen.KeyGenerators;
import com.mybatisflex.core.mask.Masks;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
@@ -27,18 +25,6 @@ public class SchisandraAuthUser implements Serializable {
@Id(keyType=KeyType.Generator, value= KeyGenerators.flexId) @Id(keyType=KeyType.Generator, value= KeyGenerators.flexId)
private Long id; private Long id;
/**
* uuid
*/
@Column(value = "uuid")
private String uuid;
/**
* source
*/
@Column(value = "source")
private String source;
@Column(value = "user_name") @Column(value = "user_name")
private String userName; private String userName;
@@ -59,12 +45,14 @@ public class SchisandraAuthUser implements Serializable {
* *
*/ */
@Column("phone") @Column("phone")
@ColumnMask(Masks.FIXED_PHONE)
private String phone; private String phone;
/** /**
* *
*/ */
@Column(value = "password") @Column(value = "password")
@ColumnMask(Masks.PASSWORD)
private String password; private String password;
/** /**

View File

@@ -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<EncryptionFilter> 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<EncryptionFilter> registration = new FilterRegistrationBean<EncryptionFilter>();
registration.setFilter(new EncryptionFilter(config));
registration.addUrlPatterns("/*");
registration.setName("EncryptionFilter");
registration.setOrder(1);
return registration;
}
}

View File

@@ -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<UpLoadPartEntityTag> 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<GetObjectResponse> 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<OssInfo> fileOssInfos = new ArrayList<>();
List<OssInfo> 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<String, Object> getClientObject() {
return new HashMap<String, Object>() {
{
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;
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<UpLoadPartEntityTag> partEntityTags) {
List<PartETag> 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<OssInfo> fileOssInfos = new ArrayList<>();
List<OssInfo> 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<String, Object> getClientObject() {
return new HashMap<String, Object>() {
{
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;
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<OssInfo> fileOssInfos = new ArrayList<>();
List<OssInfo> 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<String, Object> getClientObject() {
return new HashMap<String, Object>() {
{
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;
}
}

View File

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

View File

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

View File

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

View File

@@ -106,30 +106,34 @@
<version>5.1.1</version> <version>5.1.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!--minio-->
<dependency> <dependency>
<groupId>io.minio</groupId> <groupId>io.minio</groupId>
<artifactId>minio</artifactId> <artifactId>minio</artifactId>
<version>8.2.1</version> <version>8.2.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.coobird</groupId> <groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId> <artifactId>thumbnailator</artifactId>
<version>0.4.8</version> <version>0.4.8</version>
</dependency> </dependency>
<!-- 阿里云 -->
<dependency> <dependency>
<groupId>com.aliyun.oss</groupId> <groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId> <artifactId>aliyun-sdk-oss</artifactId>
<version>3.14.0</version> <version>3.14.0</version>
</dependency> </dependency>
<!-- 亚马逊 -->
<!--加密工具-->
<dependency> <dependency>
<groupId>com.cxytiandi</groupId> <groupId>software.amazon.awssdk</groupId>
<artifactId>monkey-api-encrypt-core</artifactId> <artifactId>s3</artifactId>
<version>1.2.2.RELEASE</version> <version>2.17.160</version>
</dependency>
<!-- 百度云对象存储 -->
<dependency>
<groupId>com.baidubce</groupId>
<artifactId>bce-java-sdk</artifactId>
<version>0.10.196</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -25,4 +25,5 @@ public interface SchisandraOssAwsDomainService {
*/ */
Boolean delete(SchisandraOssAwsBO schisandraOssAwsBO); Boolean delete(SchisandraOssAwsBO schisandraOssAwsBO);
SchisandraOssAwsBO getAwsOssConfig(String userId);
} }

View File

@@ -25,4 +25,5 @@ public interface SchisandraOssBaiduDomainService {
*/ */
Boolean delete(SchisandraOssBaiduBO schisandraOssBaiduBO); Boolean delete(SchisandraOssBaiduBO schisandraOssBaiduBO);
SchisandraOssBaiduBO getBaiduOssConfig(String userId);
} }

View File

@@ -25,4 +25,5 @@ public interface SchisandraOssFtpDomainService {
*/ */
Boolean delete(SchisandraOssFtpBO schisandraOssFtpBO); Boolean delete(SchisandraOssFtpBO schisandraOssFtpBO);
SchisandraOssFtpBO getFtpOssConfig(String userId);
} }

View File

@@ -1,8 +1,8 @@
package com.schisandra.oss.domain.service.impl; package com.schisandra.oss.domain.service.impl;
import com.schisandra.oss.common.enums.IsDeletedFlagEnum; 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.bo.SchisandraOssAwsBO;
import com.schisandra.oss.domain.convert.SchisandraOssAwsBOConverter;
import com.schisandra.oss.domain.service.SchisandraOssAwsDomainService; import com.schisandra.oss.domain.service.SchisandraOssAwsDomainService;
import com.schisandra.oss.infra.basic.entity.SchisandraOssAws; import com.schisandra.oss.infra.basic.entity.SchisandraOssAws;
import com.schisandra.oss.infra.basic.service.SchisandraOssAwsService; import com.schisandra.oss.infra.basic.service.SchisandraOssAwsService;
@@ -45,4 +45,11 @@ public class SchisandraOssAwsDomainServiceImpl implements SchisandraOssAwsDomain
return schisandraOssAwsService.update(schisandraOssAws) > 0; return schisandraOssAwsService.update(schisandraOssAws) > 0;
} }
@Override
public SchisandraOssAwsBO getAwsOssConfig(String userId) {
SchisandraOssAws awsOssConfig = schisandraOssAwsService.getAwsOssConfig(userId);
SchisandraOssAwsBO schisandraOssAwsBO = SchisandraOssAwsBOConverter.INSTANCE.convertEntityToBO(awsOssConfig);
return schisandraOssAwsBO;
}
} }

View File

@@ -1,8 +1,8 @@
package com.schisandra.oss.domain.service.impl; package com.schisandra.oss.domain.service.impl;
import com.schisandra.oss.common.enums.IsDeletedFlagEnum; 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.bo.SchisandraOssBaiduBO;
import com.schisandra.oss.domain.convert.SchisandraOssBaiduBOConverter;
import com.schisandra.oss.domain.service.SchisandraOssBaiduDomainService; import com.schisandra.oss.domain.service.SchisandraOssBaiduDomainService;
import com.schisandra.oss.infra.basic.entity.SchisandraOssBaidu; import com.schisandra.oss.infra.basic.entity.SchisandraOssBaidu;
import com.schisandra.oss.infra.basic.service.SchisandraOssBaiduService; import com.schisandra.oss.infra.basic.service.SchisandraOssBaiduService;
@@ -45,4 +45,11 @@ public class SchisandraOssBaiduDomainServiceImpl implements SchisandraOssBaiduDo
return schisandraOssBaiduService.update(schisandraOssBaidu) > 0; return schisandraOssBaiduService.update(schisandraOssBaidu) > 0;
} }
@Override
public SchisandraOssBaiduBO getBaiduOssConfig(String userId) {
SchisandraOssBaidu schisandraOssBaidu = schisandraOssBaiduService.getBaiduOssConfig(userId);
SchisandraOssBaiduBO schisandraOssBaiduBO = SchisandraOssBaiduBOConverter.INSTANCE.convertEntityToBO(schisandraOssBaidu);
return schisandraOssBaiduBO;
}
} }

View File

@@ -1,8 +1,8 @@
package com.schisandra.oss.domain.service.impl; package com.schisandra.oss.domain.service.impl;
import com.schisandra.oss.common.enums.IsDeletedFlagEnum; 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.bo.SchisandraOssFtpBO;
import com.schisandra.oss.domain.convert.SchisandraOssFtpBOConverter;
import com.schisandra.oss.domain.service.SchisandraOssFtpDomainService; import com.schisandra.oss.domain.service.SchisandraOssFtpDomainService;
import com.schisandra.oss.infra.basic.entity.SchisandraOssFtp; import com.schisandra.oss.infra.basic.entity.SchisandraOssFtp;
import com.schisandra.oss.infra.basic.service.SchisandraOssFtpService; import com.schisandra.oss.infra.basic.service.SchisandraOssFtpService;
@@ -45,4 +45,11 @@ public class SchisandraOssFtpDomainServiceImpl implements SchisandraOssFtpDomain
return schisandraOssFtpService.update(schisandraOssFtp) > 0; return schisandraOssFtpService.update(schisandraOssFtp) > 0;
} }
@Override
public SchisandraOssFtpBO getFtpOssConfig(String userId) {
SchisandraOssFtp schisandraOssFtp = schisandraOssFtpService.getFtpOssConfig(userId);
SchisandraOssFtpBO schisandraOssFtpBO = SchisandraOssFtpBOConverter.INSTANCE.convertEntityToBO(schisandraOssFtp);
return schisandraOssFtpBO;
}
} }

View File

@@ -43,4 +43,5 @@ public interface SchisandraOssAwsService {
boolean deleteById(Long id); boolean deleteById(Long id);
SchisandraOssAws getAwsOssConfig(String userId);
} }

View File

@@ -43,4 +43,5 @@ public interface SchisandraOssBaiduService {
boolean deleteById(Long id); boolean deleteById(Long id);
SchisandraOssBaidu getBaiduOssConfig(String userId);
} }

View File

@@ -43,4 +43,5 @@ public interface SchisandraOssFtpService {
boolean deleteById(Long id); boolean deleteById(Long id);
SchisandraOssFtp getFtpOssConfig(String userId);
} }

View File

@@ -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.entity.SchisandraOssAws;
import com.schisandra.oss.infra.basic.dao.SchisandraOssAwsDao; 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 com.schisandra.oss.infra.basic.service.SchisandraOssAwsService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -63,5 +64,10 @@ public class SchisandraOssAwsServiceImpl implements SchisandraOssAwsService {
return this.schisandraOssAwsDao.deleteById(id) > 0; return this.schisandraOssAwsDao.deleteById(id) > 0;
} }
@Override
public SchisandraOssAws getAwsOssConfig(String userId) {
return schisandraOssAwsDao.selectOneByCondition(SchisandraOssAwsTableDef.SCHISANDRA_OSS_AWS.USER_ID.eq(userId));
}
} }

View File

@@ -1,7 +1,8 @@
package com.schisandra.oss.infra.basic.service.impl; 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.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 com.schisandra.oss.infra.basic.service.SchisandraOssBaiduService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -38,7 +39,7 @@ public class SchisandraOssBaiduServiceImpl implements SchisandraOssBaiduService
*/ */
@Override @Override
public int insert(SchisandraOssBaidu schisandraOssBaidu) { 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 @Override
public int update(SchisandraOssBaidu schisandraOssBaidu) { 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; return this.schisandraOssBaiduDao.deleteById(id) > 0;
} }
@Override
public SchisandraOssBaidu getBaiduOssConfig(String userId) {
return schisandraOssBaiduDao.selectOneByCondition(SchisandraOssBaiduTableDef.SCHISANDRA_OSS_BAIDU.USER_ID.eq(userId));
}
} }

View File

@@ -1,7 +1,8 @@
package com.schisandra.oss.infra.basic.service.impl; 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.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 com.schisandra.oss.infra.basic.service.SchisandraOssFtpService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -38,7 +39,7 @@ public class SchisandraOssFtpServiceImpl implements SchisandraOssFtpService {
*/ */
@Override @Override
public int insert(SchisandraOssFtp schisandraOssFtp) { 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 @Override
public int update(SchisandraOssFtp schisandraOssFtp) { 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; return this.schisandraOssFtpDao.deleteById(id) > 0;
} }
@Override
public SchisandraOssFtp getFtpOssConfig(String userId) {
return schisandraOssFtpDao.selectOneByCondition(SchisandraOssFtpTableDef.SCHISANDRA_OSS_FTP.USER_ID.eq(userId));
}
} }