add(req-2080):上传文件到华为云--代码优化

This commit is contained in:
胡朝飞 2024-01-15 17:17:59 +08:00
parent cf893208fa
commit 86fc1c7724
10 changed files with 96 additions and 59 deletions

View File

@ -5,7 +5,8 @@ import cn.axzo.framework.auth.annotation.PreBuildContext;
import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.framework.auth.domain.ContextInfoHolder;
import cn.axzo.oss.client.vo.*;
import cn.axzo.oss.common.enums.FileUploadType;
import cn.axzo.oss.common.enums.ChannelTypeEnum;
import cn.axzo.oss.common.enums.FileUploadTypeEnum;
import cn.axzo.oss.common.exception.BizException;
import cn.axzo.oss.common.utils.BeanConvertUtil;
import cn.axzo.oss.manager.api.dto.request.*;
@ -123,7 +124,7 @@ public class WebFileController {
.partSize(partSize)
.uploadId(uploadId)
.build();
MultipartUploadResponse response = fileService.multipartUpload(dto, FileUploadType.OSS.getCode());
MultipartUploadResponse response = fileService.multipartUpload(dto, ChannelTypeEnum.OSS.getCode());
return CommonResponse.success(BeanConvertUtil.copyBean(response, MultipartUploadVo.class));
}
@ -140,7 +141,7 @@ public class WebFileController {
.fileName(fileName)
.file(file)
.build();
FileInformationResponse response = fileService.multipartUploadFile(dto, FileUploadType.OSS.getCode());
FileInformationResponse response = fileService.multipartUploadFile(dto, ChannelTypeEnum.OSS.getCode());
return CommonResponse.success(BeanConvertUtil.copyBean(response, FileInformationVo.class));
}
@ -149,7 +150,7 @@ public class WebFileController {
@SneakyThrows
//@PreBuildContext
public CommonResponse<FileInformationVo> multipartUploadComplete(@Valid @RequestBody MultipartUploadCompleteDto dto) {
FileInformationResponse response = fileService.multipartUploadComplete(dto, FileUploadType.OSS.getCode());
FileInformationResponse response = fileService.multipartUploadComplete(dto, ChannelTypeEnum.OSS.getCode());
return CommonResponse.success(BeanConvertUtil.copyBean(response, FileInformationVo.class));
}
@ -211,7 +212,8 @@ public class WebFileController {
.fileName(filename)
.fileContent(file.getBytes())
.build();
ServerFileUploadResponse response = fileService.uploadObs(fileUploadDto, liteSaasContext);
ServerFileUploadResponse response = fileService.uploadObs(fileUploadDto, liteSaasContext,
FileUploadTypeEnum.CHECK_POINT.getCode());
WebFileUploadVo result = BeanConvertUtil.copyBean(response, WebFileUploadVo.class);
return CommonResponse.success(result);
}
@ -244,7 +246,8 @@ public class WebFileController {
.fileName(filename)
.fileContent(file.getBytes())
.build();
ServerFileUploadResponse response = fileService.uploadObs(fileUploadDto, liteSaasContext);
ServerFileUploadResponse response = fileService.uploadObs(fileUploadDto, liteSaasContext,
FileUploadTypeEnum.MULTI_PART_UPLOAD.getCode());
WebFileUploadVo result = BeanConvertUtil.copyBean(response, WebFileUploadVo.class);
return CommonResponse.success(result);
}

View File

@ -3,13 +3,13 @@ package cn.axzo.oss.common.enums;
import lombok.Getter;
/**
* 文件上传方式枚举类
* 渠道类型枚举类
*
* @author hucf
* @since 2024/1/15 10:15
**/
@Getter
public enum FileUploadType {
public enum ChannelTypeEnum {
OSS(1, "阿里云", "aliyun"),
OBS(2, "华为云", "huaweicloud"),
;
@ -20,7 +20,7 @@ public enum FileUploadType {
private final String channelCode;
FileUploadType(Integer code, String message, String channelCode) {
ChannelTypeEnum(Integer code, String message, String channelCode) {
this.code = code;
this.message = message;
this.channelCode = channelCode;
@ -28,7 +28,7 @@ public enum FileUploadType {
public static String getChannelCodeByCode(Integer code) {
String channelCode = null;
for (FileUploadType value : FileUploadType.values()) {
for (ChannelTypeEnum value : ChannelTypeEnum.values()) {
if (value.getCode().equals(code)) {
channelCode = value.getChannelCode();
break;

View File

@ -0,0 +1,25 @@
package cn.axzo.oss.common.enums;
import lombok.Getter;
/**
* 文件上传方式枚举类
*
* @author hucf
* @since 2024/1/15 16:43
**/
@Getter
public enum FileUploadTypeEnum {
DEFAULT_UPLOAD(1, "默认"),
CHECK_POINT(2, "断点续传"),
MULTI_PART_UPLOAD(3, "分段上传")
;
private final Integer code;
private final String message;
FileUploadTypeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}

View File

@ -1,6 +1,6 @@
package cn.axzo.oss.dal.repository.impl;
import cn.axzo.oss.common.enums.FileUploadType;
import cn.axzo.oss.common.enums.ChannelTypeEnum;
import cn.axzo.oss.common.enums.IsDeleteEnum;
import cn.axzo.oss.dal.entity.AppChannelBucket;
import cn.axzo.oss.dal.mapper.AppChannelBucketMapper;
@ -30,8 +30,8 @@ public class AppChannelBucketDaoImpl extends
* @return
*/
@Override
public List<AppChannelBucket> getByAppCode(String appCode, Integer fileUploadType) {
String channelCodeByCode = FileUploadType.getChannelCodeByCode(fileUploadType);
public List<AppChannelBucket> getByAppCode(String appCode, Integer channelType) {
String channelCodeByCode = ChannelTypeEnum.getChannelCodeByCode(channelType);
return lambdaQuery().eq(AppChannelBucket::getAppCode, appCode)
.eq(Objects.nonNull(channelCodeByCode), AppChannelBucket::getChannelCode, channelCodeByCode)
.eq(AppChannelBucket::getIsDelete, IsDeleteEnum.NO.getCode()).list();

View File

@ -37,6 +37,12 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
String objectKey = appCode + "/" + fileName;
try {
if (APPCODE_CMS.equals(appCode)) {
// 普通上传方式
PutObjectRequest request = new PutObjectRequest();
request.setBucketName(bucketName);
request.setObjectKey(objectKey);
request.setInput(srcStream);
request.setIsEncodeHeaders(true);
PutObjectResult putObjectResult = obsClient.putObject(bucketName, objectKey, srcStream);
// 断点续传

View File

@ -34,7 +34,7 @@ public interface FileManager {
* @return
*/
String uploadByStream(String bulkName, String keyPath, String fileName, String appCode, byte[] fileContent,
Integer fileUploadType);
Integer channelType, Integer fileUploadType);
/**
* 下载文件

View File

@ -34,8 +34,8 @@ public class AppChannelBucketManagerImpl implements AppChannelBucketManager {
* @return
*/
@Override
public AppChannelBucket getByAppCode(String appCode, Integer fileUploadType) {
List<AppChannelBucket> appChannelBuckets = appChannelBucketDao.getByAppCode(appCode, fileUploadType);
public AppChannelBucket getByAppCode(String appCode, Integer channelType) {
List<AppChannelBucket> appChannelBuckets = appChannelBucketDao.getByAppCode(appCode, channelType);
BizException.isEmpty(appChannelBuckets, CodeEnum.APP_CHANNEL_BUCKET_NOT_FOUND);
// 找到最优渠道

View File

@ -1,6 +1,7 @@
package cn.axzo.oss.manager.impl;
import cn.axzo.oss.common.enums.FileUploadType;
import cn.axzo.oss.common.enums.ChannelTypeEnum;
import cn.axzo.oss.common.enums.FileUploadTypeEnum;
import cn.axzo.oss.common.utils.BeanConvertUtil;
import cn.axzo.oss.integration.s3.AliOssService;
import cn.axzo.oss.integration.s3.HuaWeiCloudService;
@ -51,11 +52,12 @@ public class FileManagerImpl implements FileManager {
* @param keyPath key的前置路径
*/
public String uploadByStream(String bulkName, String keyPath, String fileName, String appCode, byte[] fileContent,
Integer fileUploadType) {
Integer channelType, Integer fileUploadType) {
InputStream inputStream = new ByteArrayInputStream(fileContent);
if (fileUploadType.equals(FileUploadType.OBS.getCode())) {
if (true) {
if (channelType.equals(ChannelTypeEnum.OBS.getCode())) {
if (fileUploadType.equals(FileUploadTypeEnum.CHECK_POINT.getCode())) {
return huaWeiCloudService.uploadByStream(bulkName, keyPath, fileName, appCode, inputStream);
} else {
return huaWeiCloudService.multipartUpload(bulkName, fileName, appCode, inputStream);

View File

@ -38,13 +38,14 @@ public interface FileService {
ServerFileDownloadResponse download(ServerFileDownloadDto dto);
MultipartUploadInitResponse multipartUploadInit(MultipartUploadInitDto multipartUploadInitDto, Integer fileUploadType);
MultipartUploadInitResponse multipartUploadInit(MultipartUploadInitDto multipartUploadInitDto, Integer channelType);
MultipartUploadResponse multipartUpload(MultipartUploadDto dto, Integer fileUploadType);
MultipartUploadResponse multipartUpload(MultipartUploadDto dto, Integer channelType);
FileInformationResponse multipartUploadComplete(MultipartUploadCompleteDto dto, Integer fileUploadType);
FileInformationResponse multipartUploadComplete(MultipartUploadCompleteDto dto, Integer channelType);
FileInformationResponse multipartUploadFile(MultipartUploadFileDto dto, Integer fileUploadType);
FileInformationResponse multipartUploadFile(MultipartUploadFileDto dto, Integer channelType);
ServerFileUploadResponse uploadObs(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext);
ServerFileUploadResponse uploadObs(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext,
Integer fileUploadType);
}

View File

@ -6,10 +6,7 @@ import cn.axzo.log.platform.client.model.OperateLogReq;
import cn.axzo.oss.common.constans.CommonConstants;
import cn.axzo.oss.common.constans.CommonConstants.FileStatus;
import cn.axzo.oss.common.constans.CommonConstants.TableDelete;
import cn.axzo.oss.common.enums.CodeEnum;
import cn.axzo.oss.common.enums.FileClassEnum;
import cn.axzo.oss.common.enums.FileStatusEnum;
import cn.axzo.oss.common.enums.FileUploadType;
import cn.axzo.oss.common.enums.*;
import cn.axzo.oss.common.exception.BizException;
import cn.axzo.oss.common.utils.JsonUtil;
import cn.axzo.oss.common.utils.Utility;
@ -26,18 +23,13 @@ import cn.axzo.oss.manager.api.dto.request.*;
import cn.axzo.oss.manager.api.dto.response.*;
import cn.axzo.oss.service.api.FileService;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import com.obs.services.ObsClient;
import com.obs.services.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@ -147,7 +139,8 @@ public class FileServiceImpl implements FileService {
*/
@Override
public ServerFileUploadResponse upload(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext) {
File ossFile = uploadFileAndGetFile(dto, FileUploadType.OSS.getCode());
File ossFile = uploadFileAndGetFile(dto, ChannelTypeEnum.OSS.getCode(),
FileUploadTypeEnum.DEFAULT_UPLOAD.getCode());
//操作日志记录
operateLog(dto.toString(), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext);
return setResponse(ossFile);
@ -155,15 +148,16 @@ public class FileServiceImpl implements FileService {
@Override
public FileInformationResponse uploadV2(String serviceName, ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext) {
File ossFile = uploadFileAndGetFile(request, FileUploadType.OSS.getCode());
File ossFile = uploadFileAndGetFile(request, ChannelTypeEnum.OSS.getCode(),
FileUploadTypeEnum.DEFAULT_UPLOAD.getCode());
//操作日志记录
operateLog(request.toString(), serviceName, FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext);
return setFileInfoResp(ossFile);
}
@Override
public MultipartUploadInitResponse multipartUploadInit(MultipartUploadInitDto dto, Integer fileUploadType) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), fileUploadType);
public MultipartUploadInitResponse multipartUploadInit(MultipartUploadInitDto dto, Integer channelType) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), channelType);
// 判断容量
String fileConform = isFileConform(fileUploadConfig, 10, dto.getFileName());
String uuid = Utility.getUUID();
@ -178,8 +172,8 @@ public class FileServiceImpl implements FileService {
}
@Override
public MultipartUploadResponse multipartUpload(MultipartUploadDto dto, Integer fileUploadType) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), fileUploadType);
public MultipartUploadResponse multipartUpload(MultipartUploadDto dto, Integer channelType) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), channelType);
// 判断容量
isFileConform(fileUploadConfig, dto.getFileContent().length, dto.getFileName());
@ -198,8 +192,8 @@ public class FileServiceImpl implements FileService {
return setFileInfoResp(dto.getFile().getSize(), ossFile);
}
private File multipartUploadAndGetFile(MultipartUploadFileDto dto, Integer fileUploadType) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), fileUploadType);
private File multipartUploadAndGetFile(MultipartUploadFileDto dto, Integer channelType) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), channelType);
// 判断容量
String fileConform = isFileConform(fileUploadConfig, (int) dto.getFile().getSize() / 10, dto.getFileName());
@ -217,8 +211,8 @@ public class FileServiceImpl implements FileService {
}
@Override
public FileInformationResponse multipartUploadComplete(MultipartUploadCompleteDto dto, Integer fileUploadType) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), fileUploadType);
public FileInformationResponse multipartUploadComplete(MultipartUploadCompleteDto dto, Integer channelType) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), channelType);
// 文件合并并生成 file对象
File ossFile = completeFile(fileUploadConfig, dto.getFileName(), dto.getTgtFileKey(),
dto.getUploadId(), dto.getPartETags());
@ -252,12 +246,12 @@ public class FileServiceImpl implements FileService {
return setFileDownloadResponse(file, fileStream);
}
private FileUploadConfig getFileUploadConfig(String appCode, String bizScene, Integer fileUploadType) {
private FileUploadConfig getFileUploadConfig(String appCode, String bizScene, Integer channelType) {
// 检查appCode
checkAppCode(appCode);
// 通过appcode获取文件渠道桶信息
AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(appCode, fileUploadType);
AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(appCode, channelType);
// 通过渠道桶编码获取到具体文件业务场景
FileBusinessScene scene = fileBusinessSceneManager
@ -346,12 +340,14 @@ public class FileServiceImpl implements FileService {
}
}
private File uploadFileAndGetFile(ServerFileUploadDto dto, Integer fileUploadType) {
log.info("update fileUploadType:{}, fileName:{},appCode:{},bizScene:{}", fileUploadType,
dto.getFileName(), dto.getAppCode(), dto.getBizScene());
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), fileUploadType);
private File uploadFileAndGetFile(ServerFileUploadDto dto, Integer channelType, Integer fileUploadType) {
log.info("update channelType:{}, fileName:{}, appCode:{}, bizScene:{}",
channelType, dto.getFileName(), dto.getAppCode(), dto.getBizScene());
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), channelType);
// 上传文件并生成file对象
return generateFile(fileUploadConfig, dto, fileUploadType);
return generateFile(fileUploadConfig, dto, channelType, fileUploadType);
}
@Override
@ -490,7 +486,7 @@ public class FileServiceImpl implements FileService {
throw new BizException(CodeEnum.APP_CODE_NOT_FOUND);
}
// 通过appcode获取文件渠道桶信息
AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(appCode, FileUploadType.OSS.getCode());
AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(appCode, ChannelTypeEnum.OSS.getCode());
// 通过渠道桶编码获取到具体文件业务场景
FileBusinessScene scene = fileBusinessSceneManager
.getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), bizScene);
@ -574,7 +570,9 @@ public class FileServiceImpl implements FileService {
return fileFormat;
}
private File generateFile(FileUploadConfig fileUploadConfig, ServerFileUploadDto dto, Integer fileUploadType) {
private File generateFile(FileUploadConfig fileUploadConfig, ServerFileUploadDto dto, Integer channelType,
Integer fileUploadType) {
// 判断容量
String fileConform = isFileConform(fileUploadConfig, dto.getFileContent().length,
dto.getFileName());
@ -583,13 +581,14 @@ public class FileServiceImpl implements FileService {
String uuid = Utility.getUUID();
// 生成上传文件的唯一key
String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform);
if (fileUploadType.equals(FileUploadType.OBS.getCode())) {
// 上传文件
if (channelType.equals(ChannelTypeEnum.OBS.getCode())) {
fileUrl = fileManager.uploadByStream(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),
dto.getAppCode(), dto.getFileContent(), fileUploadType);
dto.getAppCode(), dto.getFileContent(), channelType, fileUploadType);
} else {
// 上传文件
fileUrl = fileManager.uploadByStream(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),
dto.getAppCode(), dto.getFileContent(), fileUploadType);
dto.getAppCode(), dto.getFileContent(), channelType, fileUploadType);
}
// 保存失败
@ -629,8 +628,9 @@ public class FileServiceImpl implements FileService {
}
@Override
public ServerFileUploadResponse uploadObs(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext) {
File ossFile = uploadFileAndGetFile(dto, FileUploadType.OBS.getCode());
public ServerFileUploadResponse uploadObs(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext,
Integer fileUploadType) {
File ossFile = uploadFileAndGetFile(dto, ChannelTypeEnum.OBS.getCode(), fileUploadType);
//操作日志记录
operateLog(dto.toString(), "", OBS_FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext);