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

This commit is contained in:
胡朝飞 2024-01-16 15:01:42 +08:00
parent 62ba3df5b1
commit a1ff428e47
4 changed files with 89 additions and 24 deletions

View File

@ -9,7 +9,9 @@ import java.io.InputStream;
* @since 2024/1/15 11:37
**/
public interface HuaWeiCloudService {
String uploadByStream(String bucketName, String tgtFileKey, String fileName, String appCode, InputStream srcStream);
String uploadFile(String bucketName, String fileName, String appCode, InputStream srcStream);
String checkPointUploadFile(String bucketName, String fileName, String appCode, InputStream srcStream);
String multipartUpload(String bucketName, String fileName, String appCode, InputStream srcStream);
}

View File

@ -29,8 +29,17 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
@Autowired
private HuaWeiCloudObsClient huaWeiCloudObsClient;
/**
* 上传文件到OBS普通方式
*
* @param bucketName 桶名称
* @param fileName 文件名
* @param appCode 应用编码
* @param srcStream 文件流
* @return fileUrl
*/
@Override
public String uploadByStream(String bucketName, String tgtFileKey, String fileName, String appCode, InputStream srcStream) {
public String uploadFile(String bucketName, String fileName, String appCode, InputStream srcStream) {
ObsClient obsClient = huaWeiCloudObsClient.getClient();
// 创建文件夹
@ -44,11 +53,6 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
request.setInput(srcStream);
request.setIsEncodeHeaders(true);
PutObjectResult putObjectResult = obsClient.putObject(bucketName, objectKey, srcStream);
// 断点续传
/*CompleteMultipartUploadResult completeMultipartUploadResult =
this.uploadFile(obsClient, bucketName, objectKey, fileName);*/
return putObjectResult.getObjectUrl();
} else {
// 创建上传文件的元信息通过文件云信息设置HTTP Header
@ -57,7 +61,6 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
metadata.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
metadata.setContentEncoding("utf-8");
PutObjectResult putObjectResult = obsClient.putObject(bucketName, objectKey, srcStream, metadata);
return putObjectResult.getObjectUrl();
}
} catch (ObsException exception) {
@ -69,6 +72,55 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
}
}
/**
* 上传文件到OBS断点续传
*
* @param bucketName 桶名称
* @param fileName 文件名
* @param appCode 应用编码
* @param srcStream 文件流
* @return fileUrl
*/
@Override
public String checkPointUploadFile(String bucketName, String fileName, String appCode, InputStream srcStream) {
ObsClient obsClient = huaWeiCloudObsClient.getClient();
// 创建文件夹
String objectKey = appCode + "/" + fileName;
try {
if (APPCODE_CMS.equals(appCode)) {
// 断点续传
CompleteMultipartUploadResult completeMultipartUploadResult =
this.uploadFile(obsClient, bucketName, objectKey, fileName, null);
return completeMultipartUploadResult.getObjectUrl();
} else {
// 创建上传文件的元信息通过文件云信息设置HTTP Header
ObjectMetadata metadata = new ObjectMetadata();
// 设置内容被下载时的名称
metadata.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
metadata.setContentEncoding("utf-8");
CompleteMultipartUploadResult completeMultipartUploadResult =
this.uploadFile(obsClient, bucketName, objectKey, fileName, metadata);
return completeMultipartUploadResult.getObjectUrl();
}
} catch (ObsException exception) {
LogUtil.error("uploadByStream ObsException", exception);
return "";
} catch (Exception e) {
LogUtil.error("uploadByStream ClientException", e);
return "";
}
}
/**
* 上传文件到OBS分段上传
*
* @param bucketName 桶名称
* @param fileName 文件名
* @param appCode 应用编码
* @param srcStream 文件流
* @return fileUrl
*/
@Override
public String multipartUpload(String bucketName, String fileName, String appCode, InputStream srcStream) {
@ -145,16 +197,20 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
// 断点续传
private CompleteMultipartUploadResult uploadFile(ObsClient obsClient, String bucketName, String objectKey,
String fileName) {
String fileName, ObjectMetadata metadata) {
UploadFileRequest request = new UploadFileRequest(bucketName, objectKey, fileName);
// 设置待上传的本地文件fileName为待上传的本地文件路径需要指定到具体带文件后缀的文件名
request.setUploadFile(fileName);
request.setUploadFile(objectKey);
// 设置分段上传时的最大并发数
request.setTaskNum(5);
// 设置分段大小为10MB
request.setPartSize(10 * 1024 * 1024);
// 开启断点续传模式
request.setEnableCheckpoint(true);
// 开启请求头域自动编码
request.setIsEncodeHeaders(true);
// 对象元数据
request.setObjectMetadata(metadata);
return obsClient.uploadFile(request);
}

View File

@ -2,6 +2,7 @@ package cn.axzo.oss.manager.impl;
import cn.axzo.oss.common.enums.ChannelTypeEnum;
import cn.axzo.oss.common.enums.FileUploadTypeEnum;
import cn.axzo.oss.common.enums.StorageUnitEnum;
import cn.axzo.oss.common.utils.BeanConvertUtil;
import cn.axzo.oss.integration.s3.AliOssService;
import cn.axzo.oss.integration.s3.HuaWeiCloudService;
@ -57,12 +58,27 @@ public class FileManagerImpl implements FileManager {
InputStream inputStream = new ByteArrayInputStream(fileContent);
if (channelType.equals(ChannelTypeEnum.OBS.getCode())) {
// 断点续传长度限制断点续传上传接口传入的文件大小至少要100K以上
if (fileUploadType.equals(FileUploadTypeEnum.CHECK_POINT.getCode())) {
return huaWeiCloudService.uploadByStream(bulkName, keyPath, fileName, appCode, inputStream);
int checkPointLengthLimit = StorageUnitEnum.KB.getSize() * 100;
int fileLength = fileContent.length;
if (fileLength < checkPointLengthLimit) {
fileUploadType = FileUploadTypeEnum.DEFAULT_UPLOAD.getCode();
}
}
// 上传文件到OBS
if (fileUploadType.equals(FileUploadTypeEnum.DEFAULT_UPLOAD.getCode())) {
return huaWeiCloudService.uploadFile(bulkName, fileName, appCode, inputStream);
} else if (fileUploadType.equals(FileUploadTypeEnum.CHECK_POINT.getCode())) {
return huaWeiCloudService.checkPointUploadFile(bulkName, fileName, appCode, inputStream);
} else {
return huaWeiCloudService.multipartUpload(bulkName, fileName, appCode, inputStream);
}
} else {
}
// 上传文件到阿里云
else {
return aliOssService.uploadByStream(bulkName, keyPath, fileName, appCode, inputStream);
}
}

View File

@ -574,22 +574,13 @@ public class FileServiceImpl implements FileService {
Integer fileUploadType) {
// 判断容量
String fileConform = isFileConform(fileUploadConfig, dto.getFileContent().length,
dto.getFileName());
String fileUrl = null;
String fileConform = isFileConform(fileUploadConfig, dto.getFileContent().length, dto.getFileName());
String uuid = Utility.getUUID();
// 生成上传文件的唯一key
String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform);
// 上传文件
if (channelType.equals(ChannelTypeEnum.OBS.getCode())) {
fileUrl = fileManager.uploadByStream(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),
dto.getAppCode(), dto.getFileContent(), channelType, fileUploadType);
} else {
fileUrl = fileManager.uploadByStream(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),
dto.getAppCode(), dto.getFileContent(), channelType, fileUploadType);
}
String fileUrl = fileManager.uploadByStream(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),
dto.getAppCode(), dto.getFileContent(), channelType, fileUploadType);
// 保存失败
if (Utility.isBlank(fileUrl)) {