feat: 添加完善oss
This commit is contained in:
@@ -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;
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
|
@@ -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;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@@ -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();
|
||||
|
@@ -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;
|
||||
|
||||
/**
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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";
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -106,30 +106,34 @@
|
||||
<version>5.1.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<!--minio-->
|
||||
<dependency>
|
||||
<groupId>io.minio</groupId>
|
||||
<artifactId>minio</artifactId>
|
||||
<version>8.2.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.coobird</groupId>
|
||||
<artifactId>thumbnailator</artifactId>
|
||||
<version>0.4.8</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 阿里云 -->
|
||||
<dependency>
|
||||
<groupId>com.aliyun.oss</groupId>
|
||||
<artifactId>aliyun-sdk-oss</artifactId>
|
||||
<version>3.14.0</version>
|
||||
</dependency>
|
||||
|
||||
<!--加密工具-->
|
||||
<!-- 亚马逊 -->
|
||||
<dependency>
|
||||
<groupId>com.cxytiandi</groupId>
|
||||
<artifactId>monkey-api-encrypt-core</artifactId>
|
||||
<version>1.2.2.RELEASE</version>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>s3</artifactId>
|
||||
<version>2.17.160</version>
|
||||
</dependency>
|
||||
<!-- 百度云对象存储 -->
|
||||
<dependency>
|
||||
<groupId>com.baidubce</groupId>
|
||||
<artifactId>bce-java-sdk</artifactId>
|
||||
<version>0.10.196</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
@@ -25,4 +25,5 @@ public interface SchisandraOssAwsDomainService {
|
||||
*/
|
||||
Boolean delete(SchisandraOssAwsBO schisandraOssAwsBO);
|
||||
|
||||
SchisandraOssAwsBO getAwsOssConfig(String userId);
|
||||
}
|
||||
|
@@ -25,4 +25,5 @@ public interface SchisandraOssBaiduDomainService {
|
||||
*/
|
||||
Boolean delete(SchisandraOssBaiduBO schisandraOssBaiduBO);
|
||||
|
||||
SchisandraOssBaiduBO getBaiduOssConfig(String userId);
|
||||
}
|
||||
|
@@ -25,4 +25,5 @@ public interface SchisandraOssFtpDomainService {
|
||||
*/
|
||||
Boolean delete(SchisandraOssFtpBO schisandraOssFtpBO);
|
||||
|
||||
SchisandraOssFtpBO getFtpOssConfig(String userId);
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -43,4 +43,5 @@ public interface SchisandraOssAwsService {
|
||||
boolean deleteById(Long id);
|
||||
|
||||
|
||||
SchisandraOssAws getAwsOssConfig(String userId);
|
||||
}
|
||||
|
@@ -43,4 +43,5 @@ public interface SchisandraOssBaiduService {
|
||||
boolean deleteById(Long id);
|
||||
|
||||
|
||||
SchisandraOssBaidu getBaiduOssConfig(String userId);
|
||||
}
|
||||
|
@@ -43,4 +43,5 @@ public interface SchisandraOssFtpService {
|
||||
boolean deleteById(Long id);
|
||||
|
||||
|
||||
SchisandraOssFtp getFtpOssConfig(String userId);
|
||||
}
|
||||
|
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user