feat:(REQ-3540) 加上删除文件api
This commit is contained in:
parent
ee81f7d7d6
commit
fc348855a1
@ -29,6 +29,8 @@ import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadV2Request;
|
||||
import cn.axzo.oss.http.model.copyobject.ServerFileBatchCopyObjectRequest;
|
||||
import cn.axzo.oss.http.model.copyobject.ServerFileBatchCopyObjectResponse;
|
||||
import cn.axzo.oss.http.model.copyobject.ServerFileBatchDeleteObjectRequest;
|
||||
import cn.axzo.oss.http.model.copyobject.ServerFileBatchDeleteObjectResponse;
|
||||
import cn.axzo.oss.http.model.file.FileRenameRequest;
|
||||
import cn.axzo.oss.http.model.file.FileRenameResponse;
|
||||
import cn.axzo.oss.http.model.file.UpdateFileInfoRequest;
|
||||
@ -43,6 +45,7 @@ import cn.axzo.oss.manager.api.dto.request.ServerFileUploadByUrlDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.file.DeleteObjectsFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.file.UpdateFileInfoDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.FileCopyObjectResponse;
|
||||
import cn.axzo.oss.service.api.FileByUrlService;
|
||||
@ -263,4 +266,46 @@ public class ServerFileController implements ServerFileServiceApi {
|
||||
.updateFileInfo(UpdateFileInfoDto.UpdateFileInfo.builder().fileName(request.getNewName()).build()).build();
|
||||
return CommonResponse.success(FileRenameResponse.builder().updateFlag(this.fileService.updateFileInfo(updateFileInfoDto)).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*/
|
||||
public CommonResponse<ServerFileBatchDeleteObjectResponse> batchDeleteObject(@Valid @RequestBody ServerFileBatchDeleteObjectRequest request) {
|
||||
AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getDeleteObjects()), "参数为空");
|
||||
//构建删除对象
|
||||
DeleteObjectsFileDto deleteObjectsFileDto = this.buildDeleteObjects(request);
|
||||
//删除逻辑
|
||||
this.fileService.deleteObject(deleteObjectsFileDto);
|
||||
//构建删除对象返回
|
||||
return CommonResponse.success(this.buildDeleteResponse(deleteObjectsFileDto));
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建删除对象返回
|
||||
*/
|
||||
private ServerFileBatchDeleteObjectResponse buildDeleteResponse(DeleteObjectsFileDto deleteObjectsFileDto) {
|
||||
List<ServerFileBatchDeleteObjectResponse.ServerFileDeleteObjectResponse> responses
|
||||
= deleteObjectsFileDto.getDeleteFiles().stream().map(item -> {
|
||||
return ServerFileBatchDeleteObjectResponse.ServerFileDeleteObjectResponse.builder()
|
||||
.fileKey(item.getFileKey())
|
||||
.errorCode(item.getErrorCode()).build();
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
return ServerFileBatchDeleteObjectResponse.builder().responses(responses).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建删除对象
|
||||
*/
|
||||
private DeleteObjectsFileDto buildDeleteObjects(ServerFileBatchDeleteObjectRequest request) {
|
||||
List<String> fileKeys = request.getDeleteObjects().stream().map(ServerFileBatchDeleteObjectRequest.ServerFileDeleteObjectRequest::getFileKey).collect(Collectors.toList());
|
||||
|
||||
AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(fileKeys), "参数为空");
|
||||
|
||||
List<DeleteObjectsFileDto.DeleteObjectFileDto> deleteObjectFileDtos = fileKeys.stream().map(item -> {
|
||||
return DeleteObjectsFileDto.DeleteObjectFileDto.builder().fileKey(item).build();
|
||||
}).collect(Collectors.toList());
|
||||
AssertUtil.isFalse(CollectionUtils.isEmpty(deleteObjectFileDtos), "参数为空");
|
||||
return DeleteObjectsFileDto.builder().deleteFiles(deleteObjectFileDtos).build();
|
||||
}
|
||||
}
|
||||
|
||||
@ -38,4 +38,9 @@ public interface FileDao extends IService<File> {
|
||||
* 目前只有文件名称更新,后续有其他属性可以添加
|
||||
*/
|
||||
boolean updateFileById(File file);
|
||||
|
||||
/**
|
||||
* 根据fileKeys删除
|
||||
*/
|
||||
boolean deleteByFileKeys(List<String> fileKeys);
|
||||
}
|
||||
|
||||
@ -91,4 +91,18 @@ public class FileDaoImpl extends ServiceImpl<FileMapper, File> implements FileDa
|
||||
.set(StringUtils.isNotBlank(file.getFileName()), File::getFileName, file.getFileName())
|
||||
.update();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据fileKeys删除
|
||||
*/
|
||||
@Override
|
||||
public boolean deleteByFileKeys(List<String> fileKeys) {
|
||||
if (CollectionUtil.isEmpty(fileKeys)) {
|
||||
return false;
|
||||
}
|
||||
return lambdaUpdate().in(File::getFileUuid, fileKeys)
|
||||
.eq(File::getStatus, FileStatus.SUCCESS)
|
||||
.eq(File::getIsDelete, TableDelete.UN_DELETED)
|
||||
.set(File::getIsDelete, TableDelete.DELETED).update();
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,6 +24,8 @@ import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadV2Request;
|
||||
import cn.axzo.oss.http.model.copyobject.ServerFileBatchCopyObjectRequest;
|
||||
import cn.axzo.oss.http.model.copyobject.ServerFileBatchCopyObjectResponse;
|
||||
import cn.axzo.oss.http.model.copyobject.ServerFileBatchDeleteObjectRequest;
|
||||
import cn.axzo.oss.http.model.copyobject.ServerFileBatchDeleteObjectResponse;
|
||||
import cn.axzo.oss.http.model.file.UpdateFileInfoRequest;
|
||||
import cn.axzo.oss.http.model.file.UpdateFileInfoResponse;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
@ -65,10 +67,10 @@ public interface ServerFileServiceApi {
|
||||
CommonResponse<FileInformationResponse> uploadV2(ServerFileUploadV2Request request);
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
* @param request
|
||||
* @return
|
||||
* 删除文件-方法已废弃
|
||||
* 建议换成ServerFileServiceApi#deleteObject()
|
||||
*/
|
||||
@Deprecated
|
||||
@RequestMapping(value = "/api/v1/server/delete", method = RequestMethod.POST)
|
||||
CommonResponse delete(ServerFileDeleteRequest request);
|
||||
|
||||
@ -151,4 +153,11 @@ public interface ServerFileServiceApi {
|
||||
@RequestMapping(value = "/api/server/batchCopyObject", method = RequestMethod.POST)
|
||||
CommonResponse<UpdateFileInfoResponse> updateFileInfo(@Valid @RequestBody UpdateFileInfoRequest request);
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*/
|
||||
@RequestMapping(value = "/api/server/deleteObject", method = RequestMethod.POST)
|
||||
CommonResponse<ServerFileBatchDeleteObjectResponse> batchDeleteObject(@Valid @RequestBody ServerFileBatchDeleteObjectRequest request);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,42 @@
|
||||
package cn.axzo.oss.http.model.copyobject;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 批量删除对象
|
||||
*
|
||||
* @author xudawei
|
||||
* @date 2025-03-07
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ServerFileBatchDeleteObjectRequest {
|
||||
|
||||
@NotBlank(message = "appCode must not be null")
|
||||
private String appCode;
|
||||
|
||||
@NotEmpty(message = "集合对象不能为空")
|
||||
private Set<ServerFileDeleteObjectRequest> deleteObjects;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public static class ServerFileDeleteObjectRequest {
|
||||
/**
|
||||
* 文件标识
|
||||
*/
|
||||
@NotBlank(message = "fileKey不能为空")
|
||||
private String fileKey;
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,42 @@
|
||||
package cn.axzo.oss.http.model.copyobject;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 删除文件返回
|
||||
*
|
||||
* @author xudawei
|
||||
* @date 2025-03-14
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class ServerFileBatchDeleteObjectResponse {
|
||||
|
||||
private List<ServerFileDeleteObjectResponse> responses;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public static class ServerFileDeleteObjectResponse {
|
||||
/**
|
||||
* 文件标识
|
||||
*/
|
||||
private String fileKey;
|
||||
|
||||
/**
|
||||
* 删除标识
|
||||
* true:删除成功;false:删除失败
|
||||
*/
|
||||
private String errorCode;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -2,8 +2,11 @@ package cn.axzo.oss.integration.s3;
|
||||
|
||||
import cn.axzo.oss.integration.s3.base.BaseS3Service;
|
||||
import com.aliyun.oss.model.CopyObjectResult;
|
||||
import com.aliyun.oss.model.DeleteObjectsResult;
|
||||
import com.aliyun.oss.model.SimplifiedObjectMeta;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @program: oss
|
||||
* @description: 阿里云oss服务
|
||||
@ -46,4 +49,9 @@ public interface AliOssService extends BaseS3Service {
|
||||
* 复制对象
|
||||
*/
|
||||
CopyObjectResult copyObject(String bucketName, String key, String targetBucketName, String targetKey);
|
||||
|
||||
/**
|
||||
* 批量删除File
|
||||
*/
|
||||
DeleteObjectsResult batchDeleteFile(String bucketName, List<String> keys);
|
||||
}
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
package cn.axzo.oss.integration.s3;
|
||||
|
||||
import com.obs.services.model.CopyObjectResult;
|
||||
import com.obs.services.model.DeleteObjectsResult;
|
||||
import com.obs.services.model.ObjectMetadata;
|
||||
import com.obs.services.model.TemporarySignatureResponse;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 华为云obs
|
||||
@ -57,4 +59,9 @@ public interface HuaWeiCloudService {
|
||||
* 复制对象
|
||||
*/
|
||||
CopyObjectResult copyObject(String bucketName, String key, String targetBucketName, String targetKey);
|
||||
|
||||
/**
|
||||
* 删除File
|
||||
*/
|
||||
DeleteObjectsResult batchDeleteFile(String bucketName, List<String> keyAndVersions);
|
||||
}
|
||||
|
||||
@ -13,6 +13,8 @@ import com.aliyun.oss.OSS;
|
||||
import com.aliyun.oss.OSSException;
|
||||
import com.aliyun.oss.model.CompleteMultipartUploadRequest;
|
||||
import com.aliyun.oss.model.CopyObjectResult;
|
||||
import com.aliyun.oss.model.DeleteObjectsRequest;
|
||||
import com.aliyun.oss.model.DeleteObjectsResult;
|
||||
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
|
||||
import com.aliyun.oss.model.GetObjectRequest;
|
||||
import com.aliyun.oss.model.InitiateMultipartUploadRequest;
|
||||
@ -433,4 +435,22 @@ public class AliOssServiceImpl implements AliOssService {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除File
|
||||
*/
|
||||
@Override
|
||||
public DeleteObjectsResult batchDeleteFile(String bucketName, List<String> keys) {
|
||||
try {
|
||||
log.info("aliyun batchDeleteFile params, bucketName:{}, keys:{}", bucketName, JSON.toJSONString(keys));
|
||||
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName);
|
||||
deleteObjectsRequest.setKeys(keys);
|
||||
DeleteObjectsResult deleteObjectsResult = aliOssClient.getClient().deleteObjects(deleteObjectsRequest);
|
||||
log.info("aliyun batchDeleteFile result, bucketName:{}, keys:{}, deleteObjectsResult:{}", bucketName, JSON.toJSONString(keys),JSON.toJSONString(deleteObjectsResult));
|
||||
return deleteObjectsResult;
|
||||
} catch (Exception e) {
|
||||
log.warn("aliyun batchDeleteFile exception, bucketName:{}, keys:{}", bucketName, JSON.toJSONString(keys), e);
|
||||
throw new BizException(CodeEnum.DELETE_FILE_FAIL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,12 +18,15 @@ import com.obs.services.model.CompleteMultipartUploadRequest;
|
||||
import com.obs.services.model.CompleteMultipartUploadResult;
|
||||
import com.obs.services.model.CopyObjectResult;
|
||||
import com.obs.services.model.DeleteObjectResult;
|
||||
import com.obs.services.model.DeleteObjectsRequest;
|
||||
import com.obs.services.model.DeleteObjectsResult;
|
||||
import com.obs.services.model.DownloadFileRequest;
|
||||
import com.obs.services.model.DownloadFileResult;
|
||||
import com.obs.services.model.GetObjectRequest;
|
||||
import com.obs.services.model.HttpMethodEnum;
|
||||
import com.obs.services.model.InitiateMultipartUploadRequest;
|
||||
import com.obs.services.model.InitiateMultipartUploadResult;
|
||||
import com.obs.services.model.KeyAndVersion;
|
||||
import com.obs.services.model.ObjectMetadata;
|
||||
import com.obs.services.model.ObsObject;
|
||||
import com.obs.services.model.PartEtag;
|
||||
@ -422,6 +425,28 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除File
|
||||
*/
|
||||
@Override
|
||||
public DeleteObjectsResult batchDeleteFile(String bucketName, List<String> keys) {
|
||||
try {
|
||||
if (CollectionUtils.isEmpty(keys)) {
|
||||
return new DeleteObjectsResult();
|
||||
}
|
||||
log.info("huawei cloud batchDeleteFile params, bucketName:{}, keyAndVersions:{}", bucketName, JSON.toJSONString(keys));
|
||||
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName);
|
||||
deleteObjectsRequest.setKeyAndVersions(keys.toArray(new KeyAndVersion[keys.size()]));
|
||||
|
||||
DeleteObjectsResult result = huaWeiCloudObsClient.getClient().deleteObjects(deleteObjectsRequest);
|
||||
log.info("huawei cloud batchDeleteFile result, bucketName:{},deleteObjectResult:{}", bucketName, JsonUtil.obj2Str(result));
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
log.warn("huawei cloud batchDeleteFile exception, bucketName:{}", bucketName, e);
|
||||
throw new BizException(CodeEnum.DELETE_FILE_FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
public String getUrl(String bucketName, String tgtFileKey) {
|
||||
StringBuilder allBuilder = new StringBuilder();
|
||||
allBuilder.append("https://");
|
||||
|
||||
@ -3,6 +3,7 @@ package cn.axzo.oss.manager.api;
|
||||
import cn.axzo.oss.manager.api.dto.PartETag;
|
||||
import cn.axzo.oss.manager.api.dto.request.CopyObjectCloudDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.file.DeleteObjectsFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.ManaGetObjectMetaResponse;
|
||||
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
||||
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
||||
@ -106,4 +107,11 @@ public interface FileManager {
|
||||
* 相同的通道-对象复制
|
||||
*/
|
||||
Boolean copyObjectWhenSameChannel(CopyObjectCloudDto dto);
|
||||
|
||||
/**
|
||||
* 批量删除对象
|
||||
* 1 华为云删除失败的会返回在errorResults中
|
||||
* 2 阿里云删除成功的会返回在errorResults中
|
||||
*/
|
||||
DeleteObjectsFileDto batchDeleteObjects(DeleteObjectsFileDto dto, String bucketName, String channelCode);
|
||||
}
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
package cn.axzo.oss.manager.api.dto.request.file;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author xudawei@axzo.cn
|
||||
* @date 2025/3/12
|
||||
* @description 删除文件信息
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class DeleteObjectsFileDto {
|
||||
|
||||
/**
|
||||
* 文件集合
|
||||
*/
|
||||
private List<DeleteObjectFileDto> deleteFiles;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public static class DeleteObjectFileDto {
|
||||
|
||||
/**
|
||||
* fileKey
|
||||
*/
|
||||
private String fileKey;
|
||||
/**
|
||||
* 桶key
|
||||
*/
|
||||
private String bucketKey;
|
||||
|
||||
/**
|
||||
* 错误编码
|
||||
*/
|
||||
private String errorCode;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
package cn.axzo.oss.manager.api.dto.response;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: xudawei
|
||||
* @Date: 2024/03/12
|
||||
* @Description: 授权给第三方下载
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class BatchDeleteObjectsResponse {
|
||||
|
||||
|
||||
private List<DeleteObjectResponse> deleteObjects;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class DeleteObjectResponse {
|
||||
/**
|
||||
* 文件 Key
|
||||
*/
|
||||
private String fileKey;
|
||||
|
||||
/**
|
||||
* 桶名称
|
||||
*/
|
||||
private String bucketName;
|
||||
|
||||
/**
|
||||
* 桶key
|
||||
*/
|
||||
private String bucketKey;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -14,11 +14,13 @@ import cn.axzo.oss.manager.api.FileManager;
|
||||
import cn.axzo.oss.manager.api.dto.PartETag;
|
||||
import cn.axzo.oss.manager.api.dto.request.CopyObjectCloudDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.file.DeleteObjectsFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.ManaGetObjectMetaResponse;
|
||||
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
||||
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
||||
import com.aliyun.oss.model.SimplifiedObjectMeta;
|
||||
import com.obs.services.model.CopyObjectResult;
|
||||
import com.obs.services.model.DeleteObjectsResult;
|
||||
import com.obs.services.model.ObjectMetadata;
|
||||
import com.obs.services.model.TemporarySignatureResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -33,7 +35,10 @@ import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author admin
|
||||
@ -379,5 +384,66 @@ public class FileManagerImpl implements FileManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除对象
|
||||
* 1 华为云删除失败的会返回在errorResults中
|
||||
* 2 阿里云删除成功的会返回在errorResults中
|
||||
*/
|
||||
public DeleteObjectsFileDto batchDeleteObjects(DeleteObjectsFileDto dto, String bucketName, String channelCode) {
|
||||
if (StringUtils.isBlank(bucketName)
|
||||
|| StringUtils.isBlank(channelCode)
|
||||
|| Objects.isNull(dto)
|
||||
|| CollectionUtils.isEmpty(dto.getDeleteFiles())) {
|
||||
return DeleteObjectsFileDto.builder().build();
|
||||
}
|
||||
List<String> bucketKeys = dto.getDeleteFiles().stream().map(DeleteObjectsFileDto.DeleteObjectFileDto::getBucketKey).collect(Collectors.toList());
|
||||
ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(channelCode);
|
||||
switch (typeEnum) {
|
||||
case OBS:// 华为云
|
||||
this.deleteToHuaweiCloud(dto, bucketName, bucketKeys);
|
||||
break;
|
||||
case OSS:// 阿里云
|
||||
this.deleteToAliyun(dto, bucketName, bucketKeys);
|
||||
default:
|
||||
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);
|
||||
}
|
||||
return dto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除阿里云文件
|
||||
*/
|
||||
private void deleteToAliyun(DeleteObjectsFileDto dto, String bucketName, List<String> bucketKeys) {
|
||||
com.aliyun.oss.model.DeleteObjectsResult aliResult = aliOssService.batchDeleteFile(bucketName, bucketKeys);
|
||||
Map<String, String> deleteMap = aliResult.getDeletedObjects().stream().collect(Collectors.toMap(item -> item, Function.identity(), (x, y) -> x));
|
||||
|
||||
//阿里云删除成功的会返回在errorResults中
|
||||
dto.getDeleteFiles().stream().forEach(item -> {
|
||||
if (StringUtils.isNotBlank(deleteMap.get(item.getBucketKey()))) {
|
||||
item.setErrorCode(CodeEnum.SUCCESS.getCode().toString());
|
||||
} else {
|
||||
item.setErrorCode(CodeEnum.DELETE_FILE_FAIL.getCode().toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除华为云文件
|
||||
*/
|
||||
private void deleteToHuaweiCloud(DeleteObjectsFileDto dto, String bucketName, List<String> bucketKeys) {
|
||||
DeleteObjectsResult huaweiResult = huaWeiCloudService.batchDeleteFile(bucketName, bucketKeys);
|
||||
List<DeleteObjectsResult.ErrorResult> errorResults = huaweiResult.getErrorResults();
|
||||
|
||||
Map<String, String> errorMap = errorResults.stream().collect(Collectors.toMap(item -> item.getObjectKey(), value -> value.getErrorCode(), (x, y) -> x));
|
||||
//华为云删除失败的会返回在errorResults中
|
||||
dto.getDeleteFiles().stream().forEach(item -> {
|
||||
if (StringUtils.isNotBlank(errorMap.get(item.getBucketKey()))) {
|
||||
item.setErrorCode(errorMap.get(item.getBucketKey()));
|
||||
} else {
|
||||
item.setErrorCode(CodeEnum.SUCCESS.getCode().toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -17,6 +17,7 @@ import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.file.DeleteObjectsFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.file.UpdateFileInfoDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.FileCopyObjectResponse;
|
||||
import cn.axzo.oss.manager.api.dto.response.FileInformationResponse;
|
||||
@ -132,4 +133,9 @@ public interface FileService {
|
||||
* 更新文件信息
|
||||
*/
|
||||
boolean updateFileInfo(UpdateFileInfoDto updateFileInfoDto);
|
||||
|
||||
/**
|
||||
* 删除文件信息
|
||||
*/
|
||||
void deleteObject(DeleteObjectsFileDto dto);
|
||||
}
|
||||
|
||||
@ -47,6 +47,7 @@ import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.file.DeleteObjectsFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.file.UpdateFileInfoDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.FileCopyObjectResponse;
|
||||
import cn.axzo.oss.manager.api.dto.response.FileInformationResponse;
|
||||
@ -1401,4 +1402,86 @@ public class FileServiceImpl implements FileService {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件信息
|
||||
*/
|
||||
@Override
|
||||
public void deleteObject(DeleteObjectsFileDto dto) {
|
||||
if (Objects.isNull(dto) || CollectionUtils.isEmpty(dto.getDeleteFiles())) {
|
||||
return;
|
||||
}
|
||||
// 构建fileKey与bucketKey对象集合
|
||||
Pair<List<DeleteObjectsFileDto.DeleteObjectFileDto>, File> deletePair = this.buildFileKeyAndBucketKeyList(dto);
|
||||
|
||||
if (Objects.isNull(deletePair)) {
|
||||
return;
|
||||
}
|
||||
// 删除云文件和file表
|
||||
DeleteObjectsFileDto deleteObjectsFileDto = this.deleteYunAndFile(deletePair);
|
||||
|
||||
// 重新填充dto中的errorcode
|
||||
this.rechangeDeleteObjectsFileDto(deleteObjectsFileDto, dto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除云文件和file表
|
||||
*/
|
||||
private DeleteObjectsFileDto deleteYunAndFile(Pair<List<DeleteObjectsFileDto.DeleteObjectFileDto>, File> deletePair) {
|
||||
// 删除云文件
|
||||
DeleteObjectsFileDto deleteObjectsFileDto = this.fileManager.batchDeleteObjects(DeleteObjectsFileDto.builder()
|
||||
.deleteFiles(deletePair.getKey()).build()
|
||||
, deletePair.getValue().getBucketName()
|
||||
, deletePair.getValue().getChannelCode());
|
||||
// 删除file文件
|
||||
this.deleteFiles(deleteObjectsFileDto);
|
||||
return deleteObjectsFileDto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新填充dto中的errorcode
|
||||
*/
|
||||
private void rechangeDeleteObjectsFileDto(DeleteObjectsFileDto deleteObjectsFileDto, DeleteObjectsFileDto dto) {
|
||||
Map<String, DeleteObjectsFileDto.DeleteObjectFileDto> fileKeyMap = deleteObjectsFileDto.getDeleteFiles().stream()
|
||||
.filter(item -> Objects.nonNull(item))
|
||||
.collect(Collectors.toMap(key -> key.getFileKey(), Function.identity()));
|
||||
|
||||
dto.getDeleteFiles().stream().forEach(item -> {
|
||||
if (Objects.nonNull(fileKeyMap.get(item.getFileKey()))) {
|
||||
item.setErrorCode(fileKeyMap.get(item.getFileKey()).getErrorCode());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除file文件
|
||||
*/
|
||||
private void deleteFiles(DeleteObjectsFileDto deleteObjectsFileDto) {
|
||||
List<String> delSuccessFileKeys = deleteObjectsFileDto.getDeleteFiles().stream()
|
||||
.filter(item -> Objects.nonNull(item) && item.getErrorCode().equals(CodeEnum.SUCCESS.getCode().toString()))
|
||||
.map(DeleteObjectsFileDto.DeleteObjectFileDto::getFileKey).collect(Collectors.toList());
|
||||
|
||||
this.fileDao.deleteByFileKeys(delSuccessFileKeys);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建fileKey与bucketKey对象集合
|
||||
* 1 根据fileKey,查询file表,最终构建fileKey与bucketKey对象集合
|
||||
* 2 阿里云与华为云删除最终需要bucketKey,故需要构建bucketKey
|
||||
*/
|
||||
private Pair<List<DeleteObjectsFileDto.DeleteObjectFileDto>, File> buildFileKeyAndBucketKeyList(DeleteObjectsFileDto dto) {
|
||||
List<String> fileKeys = dto.getDeleteFiles().stream().map(item -> item.getFileKey()).collect(Collectors.toList());
|
||||
List<File> byFileUuids = this.fileDao.getByFileUuids(fileKeys);
|
||||
if (CollectionUtil.isEmpty(byFileUuids)) {
|
||||
return null;
|
||||
}
|
||||
List<DeleteObjectsFileDto.DeleteObjectFileDto> deleteObjectFileDtos = byFileUuids.stream().map(item -> {
|
||||
return DeleteObjectsFileDto.DeleteObjectFileDto.builder()
|
||||
.fileKey(item.getFileUuid())
|
||||
.bucketKey(Utility.generateFileKey(item.getDirectory(), item.getFileUuid(), item.getFileFormat()))
|
||||
.build();
|
||||
}).collect(Collectors.toList());
|
||||
File file = byFileUuids.get(0);
|
||||
return Pair.of(deleteObjectFileDtos, file);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user