Merge branch 'master' into feature/REQ-3540

This commit is contained in:
xudawei 2025-04-28 17:11:37 +08:00
commit 02d056b5d9
8 changed files with 58 additions and 39 deletions

View File

@ -65,6 +65,7 @@ public enum CodeEnum implements EnumBase<Integer> {
URL_BUCKET_NAME_KEY_ALL_EMPTY(508, "url-bucketName-key同时为空"),
SIGN_URL_DOWNLOAD_FILEKEYS_EXCEEDS_MAXSIZE(509, "fileKeys exceeds the maximum size"),
FILE_TARGET_APP_IS_EMPTY(510, "target app is empty"),
CHANNELCODE_DIFF(511, "云通道不同"),
;
private final Integer code;

View File

@ -7,6 +7,8 @@ import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.Objects;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@ -149,4 +151,21 @@ public class File extends Model<File> {
return this.id;
}
public Long fetchFileSize() {
if (Objects.isNull(this.getStorageSize()) || Objects.isNull(this.getStorageUnit())) {
return 0L;
}
if (this.getStorageUnit().equalsIgnoreCase("b")) {
return this.getStorageSize().longValue();
}
if (this.getStorageUnit().equalsIgnoreCase("kb")) {
return this.getStorageSize().longValue() * 1024L;
}
if (this.getStorageUnit().equalsIgnoreCase("mb")) {
return this.getStorageSize().longValue() * 1024 * 1024L;
}
return 0L;
}
}

View File

@ -29,4 +29,9 @@ public class ApiSignUrlDownloadResponse {
*/
private String fileName;
/**
* 文件大小
*/
private Long storageSize;
}

View File

@ -52,37 +52,11 @@ public class ServerFileBatchCopyObjectRequest {
@NotBlank(message = "唯一性标识不能为空")
private String fileUuid;
/**
* 目标桶
* 如果目标桶为空,则默认取源桶
*/
private String targetBucketName;
/**
* 目标目录
* 如果目标目录为空,则默认在源目录同级
*/
private String targetDict;
/**
* 目标通道
* 如果目标通道为空,则默认源通道
*/
private String targetChannelCode;
/**
* 文件名称(包含后缀)
*/
private String targetFileName;
/**
* 桶名称
*/
private String srcBucketName;
/**
* 桶文件路径(目录+文件)
*/
private String srcBucketKey;
/**
* 文件对象key
*/

View File

@ -73,14 +73,30 @@ public class CopyObjectCloudDto {
public static CopyObjectCloudDto create(FileCopyObjectDto fileCopyObjectRequest, File file, FileBusinessScene fileBusinessScene,FileBusinessScene targetFileBiz) {
// 入参中有通道则优先取入参否则取源通道
String targetChannelCode = StringUtils.isBlank(fileCopyObjectRequest.getTargetChannelCode()) ? fileBusinessScene.getChannelCode() : fileCopyObjectRequest.getTargetChannelCode();
String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? fileBusinessScene.getBucketName() : fileCopyObjectRequest.getTargetBucketName();
String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? fileBusinessScene.getDirectory() : fileCopyObjectRequest.getTargetDict();
String fileName = StringUtils.isBlank(fileCopyObjectRequest.getTargetFileName()) ? file.getFileName() : fileCopyObjectRequest.getTargetFileName();
String appCode = (Objects.isNull(targetFileBiz) || StringUtils.isBlank(targetFileBiz.getAppCode())) ? fileBusinessScene.getAppCode() : targetFileBiz.getAppCode();
String appChannelBucketNo = (Objects.isNull(targetFileBiz) || StringUtils.isBlank(targetFileBiz.getAppChannelBucketNo())) ? fileBusinessScene.getAppChannelBucketNo() : targetFileBiz.getAppChannelBucketNo();
String targetChannelCode = fileBusinessScene.getChannelCode();
String targetBucketName = fileBusinessScene.getBucketName();
String targetBucketDict = fileBusinessScene.getDirectory();
String appCode = fileBusinessScene.getAppCode();
String appChannelBucketNo = fileBusinessScene.getAppChannelBucketNo();
if (Objects.nonNull(targetFileBiz)) {
if (StringUtils.isNotBlank(targetFileBiz.getChannelCode())) {
targetChannelCode = targetFileBiz.getChannelCode();
}
if (StringUtils.isNotBlank(targetFileBiz.getBucketName())) {
targetBucketName = targetFileBiz.getBucketName();
}
if (StringUtils.isNotBlank(targetFileBiz.getDirectory())) {
targetBucketDict = targetFileBiz.getDirectory();
}
if (StringUtils.isNotBlank(targetFileBiz.getAppCode())) {
appCode = targetFileBiz.getAppCode();
}
if (StringUtils.isNotBlank(targetFileBiz.getAppChannelBucketNo())) {
appChannelBucketNo = targetFileBiz.getAppChannelBucketNo();
}
}
String fileName = StringUtils.isNotBlank(fileCopyObjectRequest.getTargetFileName()) ? fileCopyObjectRequest.getTargetFileName() : file.getFileName();
String uuid = Utility.getUUID();
return CopyObjectCloudDto.builder()

View File

@ -30,4 +30,9 @@ public class SignUrlDownloadResponse {
*/
private String fileName;
/**
* 文件大小
*/
private Long storageSize;
}

View File

@ -357,13 +357,10 @@ public class FileManagerImpl implements FileManager {
*/
@Override
public Boolean copyObjects(CopyObjectCloudDto dto) {
//不同的通道不能复制
BizException.error(Objects.equals(dto.getSrcChannelCode(), dto.getTargetChannelCode()), CodeEnum.CHANNELCODE_DIFF);
// 相同的通道-对象复制
if (dto.getSrcChannelCode().equals(dto.getTargetChannelCode())) {
return this.copyObjectWhenSameChannel(dto);
}
// 不同的通道通过url上传至云(通过url复制至云)
String url = this.uploadByUrl(dto.getTargetBucketName(), dto.getTargetKey(), dto.getTargetFileName(), dto.getSrcUrl(), dto.getTargetChannelCode());
return StringUtils.isBlank(url) ? false : true;
return this.copyObjectWhenSameChannel(dto);
}
/**

View File

@ -981,6 +981,7 @@ public class FileServiceImpl implements FileService {
.signUrl(this.fileManager.buildPublicXImageProcess(url, style))
.fileKey(item.getFileUuid())
.fileName(item.getFileName())
.storageSize(item.fetchFileSize())
.build();
case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d
String signUrl = this.fileManager.signUrlDownload(item.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , item.getChannelCode(), item.getFileName(), style, hasFileName);
@ -988,6 +989,7 @@ public class FileServiceImpl implements FileService {
.signUrl(UrlUtil.httpToHttps(signUrl))
.fileKey(item.getFileUuid())
.fileName(item.getFileName())
.storageSize(item.fetchFileSize())
.build();
default:
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);