Merge branch 'feature/REQ-3540' into 'master'
Feature/req 3540 See merge request universal/infrastructure/backend/oss!159
This commit is contained in:
commit
215845e73a
@ -1,12 +1,10 @@
|
|||||||
package cn.axzo.oss.client.controller;
|
package cn.axzo.oss.client.controller;
|
||||||
|
|
||||||
|
import cn.axzo.basics.common.util.AssertUtil;
|
||||||
import cn.axzo.core.utils.converter.BeanConverter;
|
import cn.axzo.core.utils.converter.BeanConverter;
|
||||||
import cn.axzo.framework.auth.domain.ContextInfo;
|
import cn.axzo.framework.auth.domain.ContextInfo;
|
||||||
import cn.axzo.oss.common.enums.ChannelTypeEnum;
|
import cn.axzo.oss.client.convert.ServerFileConvert;
|
||||||
import cn.axzo.oss.common.enums.CodeEnum;
|
|
||||||
import cn.axzo.oss.common.exception.BizException;
|
|
||||||
import cn.axzo.oss.common.utils.BeanConvertUtil;
|
import cn.axzo.oss.common.utils.BeanConvertUtil;
|
||||||
import cn.axzo.oss.common.utils.UrlUtil;
|
|
||||||
import cn.axzo.oss.http.api.ServerFileServiceApi;
|
import cn.axzo.oss.http.api.ServerFileServiceApi;
|
||||||
import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
|
import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
|
||||||
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
|
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
|
||||||
@ -30,27 +28,37 @@ import cn.axzo.oss.http.model.ServerFileUploadByUrlRequest;
|
|||||||
import cn.axzo.oss.http.model.ServerFileUploadRequest;
|
import cn.axzo.oss.http.model.ServerFileUploadRequest;
|
||||||
import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
||||||
import cn.axzo.oss.http.model.ServerFileUploadV2Request;
|
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;
|
||||||
|
import cn.axzo.oss.http.model.file.UpdateFileInfoResponse;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.AppInfoDto;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
|
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
|
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.ServerFileCopyToDictDto;
|
|
||||||
import cn.axzo.oss.manager.api.dto.request.GetObjectMetaDto;
|
import cn.axzo.oss.manager.api.dto.request.GetObjectMetaDto;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.ServerFileCopyToDictDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto;
|
import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadByUrlDto;
|
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.ServerFileUploadDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
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.SignUrlUploadDto;
|
||||||
import cn.axzo.oss.manager.api.dto.response.ManaGetObjectMetaResponse;
|
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;
|
import cn.axzo.oss.service.api.FileByUrlService;
|
||||||
import cn.axzo.oss.service.api.FileCopyToDictService;
|
import cn.axzo.oss.service.api.FileCopyToDictService;
|
||||||
import cn.axzo.oss.service.api.FileService;
|
import cn.axzo.oss.service.api.FileService;
|
||||||
import cn.azxo.framework.common.model.CommonResponse;
|
import cn.azxo.framework.common.model.CommonResponse;
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
@ -231,4 +239,75 @@ public class ServerFileController implements ServerFileServiceApi {
|
|||||||
dto.setBizScene(dto.getAppCode() + "-public");
|
dto.setBizScene(dto.getAppCode() + "-public");
|
||||||
return CommonResponse.success(BeanConverter.convert(fileService.signUrlUpload(dto, ContextInfo.LiteSaasContext.builder().build()), FetchUploadSignUrlToPublishResponse.class));
|
return CommonResponse.success(BeanConverter.convert(fileService.signUrlUpload(dto, ContextInfo.LiteSaasContext.builder().build()), FetchUploadSignUrlToPublishResponse.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制文件
|
||||||
|
*/
|
||||||
|
public CommonResponse<ServerFileBatchCopyObjectResponse> batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) {
|
||||||
|
AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空");
|
||||||
|
List<FileCopyObjectDto> fileCopyObjectDtos = BeanUtil.copyToList(request.getCopyObjects(), FileCopyObjectDto.class);
|
||||||
|
List<FileCopyObjectResponse> fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, ServerFileConvert.copyObjectConvertAppInfo(request));
|
||||||
|
return CommonResponse.success(ServerFileBatchCopyObjectResponse.builder().responses(BeanUtil.copyToList(fileCopyObjectResponses, ServerFileBatchCopyObjectResponse.ServerFileCopyObjectResponse.class)).build());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件信息
|
||||||
|
*/
|
||||||
|
public CommonResponse<UpdateFileInfoResponse> updateFileInfo(@Valid @RequestBody UpdateFileInfoRequest request) {
|
||||||
|
UpdateFileInfoDto updateFileInfoDto = BeanUtil.copyProperties(request, UpdateFileInfoDto.class);
|
||||||
|
return CommonResponse.success(UpdateFileInfoResponse.builder().updateFlag(this.fileService.updateFileInfo(updateFileInfoDto)).build());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件信息
|
||||||
|
*/
|
||||||
|
public CommonResponse<FileRenameResponse> rename(@Valid @RequestBody FileRenameRequest request) {
|
||||||
|
UpdateFileInfoDto updateFileInfoDto = UpdateFileInfoDto.builder()
|
||||||
|
.fileKey(request.getFileKey())
|
||||||
|
.fileId(request.getFileId())
|
||||||
|
.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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,25 @@
|
|||||||
|
package cn.axzo.oss.client.convert;
|
||||||
|
|
||||||
|
import cn.axzo.oss.http.model.copyobject.ServerFileBatchCopyObjectRequest;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.AppInfoDto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xudawei@axzo.cn
|
||||||
|
* @date 2025/3/21
|
||||||
|
* @description 对象转换
|
||||||
|
*/
|
||||||
|
public class ServerFileConvert {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 克隆对象转换成AppInfo
|
||||||
|
*/
|
||||||
|
public static AppInfoDto copyObjectConvertAppInfo(ServerFileBatchCopyObjectRequest request) {
|
||||||
|
return AppInfoDto.builder()
|
||||||
|
.appCode(request.getAppCode())
|
||||||
|
.bizScene(request.getBizScene())
|
||||||
|
.targetAppCode(request.getTargetAppCode())
|
||||||
|
.targetBizScene(request.getTargetBizScene())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -64,6 +64,7 @@ public enum CodeEnum implements EnumBase<Integer> {
|
|||||||
GET_OBJECT_META_FAIL(507, "获取元文件失败"),
|
GET_OBJECT_META_FAIL(507, "获取元文件失败"),
|
||||||
URL_BUCKET_NAME_KEY_ALL_EMPTY(508, "url-bucketName-key同时为空"),
|
URL_BUCKET_NAME_KEY_ALL_EMPTY(508, "url-bucketName-key同时为空"),
|
||||||
SIGN_URL_DOWNLOAD_FILEKEYS_EXCEEDS_MAXSIZE(509, "fileKeys exceeds the maximum size"),
|
SIGN_URL_DOWNLOAD_FILEKEYS_EXCEEDS_MAXSIZE(509, "fileKeys exceeds the maximum size"),
|
||||||
|
FILE_TARGET_APP_IS_EMPTY(510, "target app is empty"),
|
||||||
;
|
;
|
||||||
|
|
||||||
private final Integer code;
|
private final Integer code;
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package cn.axzo.oss.dal.repository;
|
package cn.axzo.oss.dal.repository;
|
||||||
|
|
||||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||||
|
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -30,4 +31,6 @@ public interface FileBusinessSceneDao extends IService<FileBusinessScene> {
|
|||||||
* 根据bucketNo与场景,获取批量FileBusinessScene对象
|
* 根据bucketNo与场景,获取批量FileBusinessScene对象
|
||||||
*/
|
*/
|
||||||
List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScen);
|
List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScen);
|
||||||
|
|
||||||
|
List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,4 +32,15 @@ public interface FileDao extends IService<File> {
|
|||||||
File getByUrlMd5(String urlMd5);
|
File getByUrlMd5(String urlMd5);
|
||||||
|
|
||||||
boolean deleteFile(String fileUuid);
|
boolean deleteFile(String fileUuid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件
|
||||||
|
* 目前只有文件名称更新,后续有其他属性可以添加
|
||||||
|
*/
|
||||||
|
boolean updateFileById(File file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据fileKeys删除
|
||||||
|
*/
|
||||||
|
boolean deleteByFileKeys(List<String> fileKeys);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import cn.axzo.oss.common.enums.IsDeleteEnum;
|
|||||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||||
import cn.axzo.oss.dal.mapper.FileBusinessSceneMapper;
|
import cn.axzo.oss.dal.mapper.FileBusinessSceneMapper;
|
||||||
import cn.axzo.oss.dal.repository.FileBusinessSceneDao;
|
import cn.axzo.oss.dal.repository.FileBusinessSceneDao;
|
||||||
|
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@ -50,4 +51,12 @@ public class FileBusinessSceneDaoImpl extends
|
|||||||
.eq(StringUtils.isNotBlank(bizScene), FileBusinessScene::getBusinessScene, StringUtils.isNotBlank(bizScene) ? bizScene : StringUtils.EMPTY)
|
.eq(StringUtils.isNotBlank(bizScene), FileBusinessScene::getBusinessScene, StringUtils.isNotBlank(bizScene) ? bizScene : StringUtils.EMPTY)
|
||||||
.eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list();
|
.eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo) {
|
||||||
|
return lambdaQuery().eq(FileBusinessScene::getAppCode, vo.getAppCode())
|
||||||
|
.eq(FileBusinessScene::getBusinessScene,vo.getBusinessScene())
|
||||||
|
.eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,9 +10,11 @@ import cn.axzo.oss.dal.repository.FileDao;
|
|||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@ -75,4 +77,32 @@ public class FileDaoImpl extends ServiceImpl<FileMapper, File> implements FileDa
|
|||||||
.set(File::getStatus, FileStatusEnum.STATUS_DELETE.getCode())
|
.set(File::getStatus, FileStatusEnum.STATUS_DELETE.getCode())
|
||||||
.set(File::getIsDelete, IsDeleteEnum.YES.getCode()).update();
|
.set(File::getIsDelete, IsDeleteEnum.YES.getCode()).update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件
|
||||||
|
* 目前只有文件名称更新,后续有其他属性可以添加
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean updateFileById(File file) {
|
||||||
|
if (Objects.isNull(file) || Objects.isNull(file.getId())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return lambdaUpdate().eq(File::getId, file.getId())
|
||||||
|
.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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,20 @@
|
|||||||
|
package cn.axzo.oss.dal.vo;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xudawei@axzo.cn
|
||||||
|
* @date 2025/3/20
|
||||||
|
* @description FileBusinessSceneVo
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class FileBusinessSceneVo {
|
||||||
|
private String appCode;
|
||||||
|
private String businessScene;
|
||||||
|
}
|
||||||
@ -22,6 +22,14 @@ import cn.axzo.oss.http.model.ServerFileUploadByUrlRequest;
|
|||||||
import cn.axzo.oss.http.model.ServerFileUploadRequest;
|
import cn.axzo.oss.http.model.ServerFileUploadRequest;
|
||||||
import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
||||||
import cn.axzo.oss.http.model.ServerFileUploadV2Request;
|
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;
|
||||||
|
import cn.axzo.oss.http.model.file.UpdateFileInfoResponse;
|
||||||
import cn.azxo.framework.common.model.CommonResponse;
|
import cn.azxo.framework.common.model.CommonResponse;
|
||||||
import org.springframework.cloud.openfeign.FeignClient;
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
@ -61,10 +69,10 @@ public interface ServerFileServiceApi {
|
|||||||
CommonResponse<FileInformationResponse> uploadV2(ServerFileUploadV2Request request);
|
CommonResponse<FileInformationResponse> uploadV2(ServerFileUploadV2Request request);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除文件
|
* 删除文件-方法已废弃
|
||||||
* @param request
|
* 建议换成ServerFileServiceApi#deleteObject()
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@RequestMapping(value = "/api/v1/server/delete", method = RequestMethod.POST)
|
@RequestMapping(value = "/api/v1/server/delete", method = RequestMethod.POST)
|
||||||
CommonResponse delete(ServerFileDeleteRequest request);
|
CommonResponse delete(ServerFileDeleteRequest request);
|
||||||
|
|
||||||
@ -135,4 +143,29 @@ public interface ServerFileServiceApi {
|
|||||||
@RequestMapping(value = "/api/server/copyToDict", method = RequestMethod.POST)
|
@RequestMapping(value = "/api/server/copyToDict", method = RequestMethod.POST)
|
||||||
CommonResponse<ServerFileCopyToDictResponse> copyToDict(ServerFileCopyToDictRequest request);
|
CommonResponse<ServerFileCopyToDictResponse> copyToDict(ServerFileCopyToDictRequest request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制文件
|
||||||
|
*/
|
||||||
|
@RequestMapping(value = "/api/server/batchCopyObject", method = RequestMethod.POST)
|
||||||
|
CommonResponse<ServerFileBatchCopyObjectResponse> batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件信息
|
||||||
|
*/
|
||||||
|
@RequestMapping(value = "/api/server/updateFileInfo", method = RequestMethod.POST)
|
||||||
|
CommonResponse<UpdateFileInfoResponse> updateFileInfo(@Valid @RequestBody UpdateFileInfoRequest request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重命名
|
||||||
|
*/
|
||||||
|
@RequestMapping(value = "/api/server/rename", method = RequestMethod.POST)
|
||||||
|
CommonResponse<FileRenameResponse> rename(@Valid @RequestBody FileRenameRequest request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除文件
|
||||||
|
*/
|
||||||
|
@RequestMapping(value = "/api/server/deleteObject", method = RequestMethod.POST)
|
||||||
|
CommonResponse<ServerFileBatchDeleteObjectResponse> batchDeleteObject(@Valid @RequestBody ServerFileBatchDeleteObjectRequest request);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,4 +65,9 @@ public class ApiSignUrlUploadRequest {
|
|||||||
* 桶key
|
* 桶key
|
||||||
*/
|
*/
|
||||||
private String bucketKey;
|
private String bucketKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件key
|
||||||
|
*/
|
||||||
|
private String fileKey;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,92 @@
|
|||||||
|
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 ServerFileBatchCopyObjectRequest {
|
||||||
|
|
||||||
|
@NotBlank(message = "appCode must not be null")
|
||||||
|
private String appCode;
|
||||||
|
|
||||||
|
@NotBlank(message = "bizScene must not be null")
|
||||||
|
private String bizScene;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标appCode
|
||||||
|
*/
|
||||||
|
private String targetAppCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标bizScene
|
||||||
|
*/
|
||||||
|
private String targetBizScene;
|
||||||
|
|
||||||
|
@NotEmpty(message = "集合对象不能为空")
|
||||||
|
private Set<ServerFileCopyObjectRequest> copyObjects;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public static class ServerFileCopyObjectRequest {
|
||||||
|
/**
|
||||||
|
* 唯一标识
|
||||||
|
* 没有唯一标识,可以与fileKey一致
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "唯一性标识不能为空")
|
||||||
|
private String fileUuid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标桶
|
||||||
|
* 如果目标桶为空,则默认取源桶
|
||||||
|
*/
|
||||||
|
private String targetBucketName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标目录
|
||||||
|
* 如果目标目录为空,则默认在源目录同级
|
||||||
|
*/
|
||||||
|
private String targetDict;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标通道
|
||||||
|
* 如果目标通道为空,则默认源通道
|
||||||
|
*/
|
||||||
|
private String targetChannelCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名称(包含后缀)
|
||||||
|
*/
|
||||||
|
private String targetFileName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 桶名称
|
||||||
|
*/
|
||||||
|
private String srcBucketName;
|
||||||
|
/**
|
||||||
|
* 桶文件路径(目录+文件)
|
||||||
|
*/
|
||||||
|
private String srcBucketKey;
|
||||||
|
/**
|
||||||
|
* 文件对象key
|
||||||
|
*/
|
||||||
|
private String srcFileKey;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
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 2024-07-01
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class ServerFileBatchCopyObjectResponse {
|
||||||
|
|
||||||
|
private List<ServerFileCopyObjectResponse> responses;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public static class ServerFileCopyObjectResponse {
|
||||||
|
/**
|
||||||
|
* 唯一标识,没有唯一标识,可以与fileKey一致
|
||||||
|
*/
|
||||||
|
private String fileUuid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标文件fileKey
|
||||||
|
*/
|
||||||
|
private String targetFileKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标通道
|
||||||
|
*/
|
||||||
|
private String targetChannelCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 桶名称
|
||||||
|
*/
|
||||||
|
private String srcBucketName;
|
||||||
|
/**
|
||||||
|
* 桶文件目录
|
||||||
|
*/
|
||||||
|
private String srcBucketDict;
|
||||||
|
/**
|
||||||
|
* 文件对象key
|
||||||
|
*/
|
||||||
|
private String srcFileKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名称
|
||||||
|
*/
|
||||||
|
private String srcFileName;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
package cn.axzo.oss.http.model.file;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件请求
|
||||||
|
*
|
||||||
|
* @author xudawei
|
||||||
|
* @date 2025-03-12
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class FileRenameRequest {
|
||||||
|
/**
|
||||||
|
* 文件Id
|
||||||
|
*/
|
||||||
|
private Long fileId;
|
||||||
|
/**
|
||||||
|
* 文件fileKey
|
||||||
|
*/
|
||||||
|
private String fileKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新名称
|
||||||
|
*/
|
||||||
|
private String newName;
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package cn.axzo.oss.http.model.file;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件请求
|
||||||
|
*
|
||||||
|
* @author xudawei
|
||||||
|
* @date 2025-03-12
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class FileRenameResponse {
|
||||||
|
/**
|
||||||
|
* 文件Id
|
||||||
|
*/
|
||||||
|
private boolean updateFlag;
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
package cn.axzo.oss.http.model.file;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件请求
|
||||||
|
*
|
||||||
|
* @author xudawei
|
||||||
|
* @date 2025-03-12
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class UpdateFileInfoRequest {
|
||||||
|
/**
|
||||||
|
* 文件Id
|
||||||
|
*/
|
||||||
|
private Long fileId;
|
||||||
|
/**
|
||||||
|
* 文件fileKey
|
||||||
|
*/
|
||||||
|
private String fileKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 需要更新属性
|
||||||
|
*/
|
||||||
|
private UpdateFileInfo updateFileInfo;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public static class UpdateFileInfo{
|
||||||
|
/**
|
||||||
|
* 文件名称
|
||||||
|
*/
|
||||||
|
private String fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package cn.axzo.oss.http.model.file;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件更新返回
|
||||||
|
*
|
||||||
|
* @author xudawei
|
||||||
|
* @date 2025-03-12
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class UpdateFileInfoResponse {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件Id
|
||||||
|
*/
|
||||||
|
private boolean updateFlag;
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,8 +1,12 @@
|
|||||||
package cn.axzo.oss.integration.s3;
|
package cn.axzo.oss.integration.s3;
|
||||||
|
|
||||||
import cn.axzo.oss.integration.s3.base.BaseS3Service;
|
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 com.aliyun.oss.model.SimplifiedObjectMeta;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @program: oss
|
* @program: oss
|
||||||
* @description: 阿里云oss服务
|
* @description: 阿里云oss服务
|
||||||
@ -40,4 +44,14 @@ public interface AliOssService extends BaseS3Service {
|
|||||||
* 通过url上传至OBS
|
* 通过url上传至OBS
|
||||||
*/
|
*/
|
||||||
String uploadByUrl(String bucketName, String tgtFileKey, String fileName, String url);
|
String uploadByUrl(String bucketName, String tgtFileKey, String fileName, String url);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制对象
|
||||||
|
*/
|
||||||
|
CopyObjectResult copyObject(String bucketName, String key, String targetBucketName, String targetKey);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除File
|
||||||
|
*/
|
||||||
|
DeleteObjectsResult batchDeleteFile(String bucketName, List<String> keys);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
package cn.axzo.oss.integration.s3;
|
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.ObjectMetadata;
|
||||||
import com.obs.services.model.TemporarySignatureResponse;
|
import com.obs.services.model.TemporarySignatureResponse;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 华为云obs
|
* 华为云obs
|
||||||
@ -53,7 +56,12 @@ public interface HuaWeiCloudService {
|
|||||||
ObjectMetadata getObjectMeta(String bucketName, String key, String url);
|
ObjectMetadata getObjectMeta(String bucketName, String key, String url);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 元数据
|
* 复制对象
|
||||||
*/
|
*/
|
||||||
boolean copyToDict(String bucketName, String key, String targetBucketName, String targetKey);
|
CopyObjectResult copyObject(String bucketName, String key, String targetBucketName, String targetKey);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除File
|
||||||
|
*/
|
||||||
|
DeleteObjectsResult batchDeleteFile(String bucketName, List<String> keyAndVersions);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,10 +7,14 @@ import cn.axzo.oss.integration.s3.AliOssService;
|
|||||||
import cn.axzo.oss.integration.s3.client.AliOssAppProClient;
|
import cn.axzo.oss.integration.s3.client.AliOssAppProClient;
|
||||||
import cn.axzo.oss.integration.s3.client.AliOssClient;
|
import cn.axzo.oss.integration.s3.client.AliOssClient;
|
||||||
import cn.azxo.framework.common.utils.LogUtil;
|
import cn.azxo.framework.common.utils.LogUtil;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.aliyun.oss.HttpMethod;
|
import com.aliyun.oss.HttpMethod;
|
||||||
import com.aliyun.oss.OSS;
|
import com.aliyun.oss.OSS;
|
||||||
import com.aliyun.oss.OSSException;
|
import com.aliyun.oss.OSSException;
|
||||||
import com.aliyun.oss.model.CompleteMultipartUploadRequest;
|
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.GeneratePresignedUrlRequest;
|
||||||
import com.aliyun.oss.model.GetObjectRequest;
|
import com.aliyun.oss.model.GetObjectRequest;
|
||||||
import com.aliyun.oss.model.InitiateMultipartUploadRequest;
|
import com.aliyun.oss.model.InitiateMultipartUploadRequest;
|
||||||
@ -415,4 +419,38 @@ public class AliOssServiceImpl implements AliOssService {
|
|||||||
|
|
||||||
return getUrl(bucketName, tgtFileKey);
|
return getUrl(bucketName, tgtFileKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public CopyObjectResult copyObject(String bucketName, String key, String targetBucketName, String targetKey) {
|
||||||
|
try {
|
||||||
|
log.info("aliOssService#copyObject,params bucketName:{}, key:{}, targetBucketName:{}, targetKey:{}", bucketName, key, targetBucketName, targetKey);
|
||||||
|
CopyObjectResult copyObjectResult = aliOssClient.getClient().copyObject(bucketName, key, targetBucketName, targetKey);
|
||||||
|
log.info("aliOssService#copyObject,bucketName:{}, key:{},result:{}", bucketName, key, JSON.toJSONString(copyObjectResult));
|
||||||
|
return copyObjectResult;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("aliyun-copyObject-exception, bucketName:{}, key:{}", bucketName, key, e);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,19 +10,23 @@ import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig;
|
|||||||
import cn.azxo.framework.common.utils.LogUtil;
|
import cn.azxo.framework.common.utils.LogUtil;
|
||||||
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.obs.services.ObsClient;
|
import com.obs.services.ObsClient;
|
||||||
import com.obs.services.exception.ObsException;
|
import com.obs.services.exception.ObsException;
|
||||||
import com.obs.services.model.CompleteMultipartUploadRequest;
|
import com.obs.services.model.CompleteMultipartUploadRequest;
|
||||||
import com.obs.services.model.CompleteMultipartUploadResult;
|
import com.obs.services.model.CompleteMultipartUploadResult;
|
||||||
import com.obs.services.model.CopyObjectRequest;
|
import com.obs.services.model.CopyObjectResult;
|
||||||
import com.obs.services.model.DeleteObjectResult;
|
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.DownloadFileRequest;
|
||||||
import com.obs.services.model.DownloadFileResult;
|
import com.obs.services.model.DownloadFileResult;
|
||||||
import com.obs.services.model.GetObjectRequest;
|
import com.obs.services.model.GetObjectRequest;
|
||||||
import com.obs.services.model.HttpMethodEnum;
|
import com.obs.services.model.HttpMethodEnum;
|
||||||
import com.obs.services.model.InitiateMultipartUploadRequest;
|
import com.obs.services.model.InitiateMultipartUploadRequest;
|
||||||
import com.obs.services.model.InitiateMultipartUploadResult;
|
import com.obs.services.model.InitiateMultipartUploadResult;
|
||||||
|
import com.obs.services.model.KeyAndVersion;
|
||||||
import com.obs.services.model.ObjectMetadata;
|
import com.obs.services.model.ObjectMetadata;
|
||||||
import com.obs.services.model.ObsObject;
|
import com.obs.services.model.ObsObject;
|
||||||
import com.obs.services.model.PartEtag;
|
import com.obs.services.model.PartEtag;
|
||||||
@ -421,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) {
|
public String getUrl(String bucketName, String tgtFileKey) {
|
||||||
StringBuilder allBuilder = new StringBuilder();
|
StringBuilder allBuilder = new StringBuilder();
|
||||||
allBuilder.append("https://");
|
allBuilder.append("https://");
|
||||||
@ -475,21 +501,18 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 元数据
|
* 复制对象
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean copyToDict(String bucketName, String key, String targetBucketName, String targetKey) {
|
public CopyObjectResult copyObject(String bucketName, String key, String targetBucketName, String targetKey) {
|
||||||
try {
|
try {
|
||||||
CopyObjectRequest request = new CopyObjectRequest();
|
log.info("huaWeiCloudService#copyObject,params bucketName:{},key:{},targetBucketName:{},targetKey:{}", bucketName, key, targetBucketName, targetKey);
|
||||||
request.setSourceBucketName(bucketName);
|
CopyObjectResult copyObjectResult = huaWeiCloudObsClient.getClient().copyObject(bucketName, key, targetBucketName, targetKey);
|
||||||
request.setSourceObjectKey(key);
|
log.info("huaWeiCloudService#copyObject,params,bucketName:{},key:{},result:{}", bucketName, key, JSON.toJSONString(copyObjectResult));
|
||||||
request.setDestinationBucketName(targetBucketName);
|
return copyObjectResult;
|
||||||
request.setDestinationObjectKey(targetKey);
|
|
||||||
huaWeiCloudObsClient.getClient().copyObject(request);
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warn("huaweicloud-copyToDict-exception, bucketName:{}, key:{}", bucketName, key, e);
|
log.warn("huaweicloud-copyToDict-exception, bucketName:{}, key:{},targetBucketName:{},targetKey:{}", bucketName, key, targetBucketName,targetKey, e);
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package cn.axzo.oss.manager.api;
|
package cn.axzo.oss.manager.api;
|
||||||
|
|
||||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||||
|
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -25,4 +26,6 @@ public interface FileBusinessSceneManager {
|
|||||||
* 指定appcode文件业务场景
|
* 指定appcode文件业务场景
|
||||||
*/
|
*/
|
||||||
List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScene);
|
List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScene);
|
||||||
|
|
||||||
|
List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
package cn.axzo.oss.manager.api;
|
package cn.axzo.oss.manager.api;
|
||||||
|
|
||||||
import cn.axzo.oss.manager.api.dto.PartETag;
|
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.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.ManaGetObjectMetaResponse;
|
||||||
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
||||||
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
||||||
@ -95,4 +97,21 @@ public interface FileManager {
|
|||||||
* 构建公开Style
|
* 构建公开Style
|
||||||
*/
|
*/
|
||||||
String buildPublicXImageProcess(String url, String style);
|
String buildPublicXImageProcess(String url, String style);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制对象
|
||||||
|
*/
|
||||||
|
Boolean copyObjects(CopyObjectCloudDto dto);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 相同的通道-对象复制
|
||||||
|
*/
|
||||||
|
Boolean copyObjectWhenSameChannel(CopyObjectCloudDto dto);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除对象
|
||||||
|
* 1 华为云删除失败的会返回在errorResults中
|
||||||
|
* 2 阿里云删除成功的会返回在errorResults中
|
||||||
|
*/
|
||||||
|
DeleteObjectsFileDto batchDeleteObjects(DeleteObjectsFileDto dto, String bucketName, String channelCode);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,38 @@
|
|||||||
|
package cn.axzo.oss.manager.api.dto.request;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xudawei@axzo.cn
|
||||||
|
* @date 2025/3/20
|
||||||
|
* @description app
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class AppInfoDto {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* appCode
|
||||||
|
*/
|
||||||
|
private String appCode;
|
||||||
|
/**
|
||||||
|
* bizScene
|
||||||
|
*/
|
||||||
|
private String bizScene;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标appCode
|
||||||
|
*/
|
||||||
|
private String targetAppCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标bizScene
|
||||||
|
*/
|
||||||
|
private String targetBizScene;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,103 @@
|
|||||||
|
package cn.axzo.oss.manager.api.dto.request;
|
||||||
|
|
||||||
|
import cn.axzo.oss.common.utils.Utility;
|
||||||
|
import cn.axzo.oss.dal.entity.File;
|
||||||
|
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xudawei@axzo.cn
|
||||||
|
* @date 2025/3/10
|
||||||
|
* @description 对象复制Dto
|
||||||
|
*/
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class CopyObjectCloudDto {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 源桶名称
|
||||||
|
* 比如:axzo-oss
|
||||||
|
*/
|
||||||
|
private String srcBucketName;
|
||||||
|
/**
|
||||||
|
* 源桶key(三方的桶上的目录+文件名称)
|
||||||
|
* 比如 zeus/recruit_collect/93248404217a4576ba2698183c3fc7a1.xlsx
|
||||||
|
*/
|
||||||
|
private String srcBucketKey;
|
||||||
|
/**
|
||||||
|
* 源通道
|
||||||
|
*/
|
||||||
|
private String srcChannelCode;
|
||||||
|
/**
|
||||||
|
* 源Url
|
||||||
|
*/
|
||||||
|
private String srcUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目的桶名称
|
||||||
|
*/
|
||||||
|
private String targetBucketName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目的桶目录
|
||||||
|
*/
|
||||||
|
private String targetBucketDict;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目的桶key(三方的桶上的目录+文件名称)
|
||||||
|
*/
|
||||||
|
private String targetBucketKey;
|
||||||
|
/**
|
||||||
|
* 目的key(文件唯一标识)
|
||||||
|
* 比如:93248404217a4576ba2698183c3fc7a1
|
||||||
|
*/
|
||||||
|
private String targetKey;
|
||||||
|
private String targetChannelCode;
|
||||||
|
|
||||||
|
private String targetFileName;
|
||||||
|
|
||||||
|
private File file;
|
||||||
|
private String fileUuid;
|
||||||
|
|
||||||
|
private String appChannelBucketNo;
|
||||||
|
|
||||||
|
private String appCode;
|
||||||
|
|
||||||
|
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 uuid = Utility.getUUID();
|
||||||
|
|
||||||
|
return CopyObjectCloudDto.builder()
|
||||||
|
.srcBucketName(file.getBucketName())
|
||||||
|
.srcBucketKey(Utility.generateFileKey(file.getDirectory(), file.getFileUuid(), file.getFileFormat()))
|
||||||
|
.srcChannelCode(file.getChannelCode())
|
||||||
|
.targetBucketName(targetBucketName)
|
||||||
|
.targetBucketDict(targetBucketDict)
|
||||||
|
.targetBucketKey(Utility.generateFileKey(targetBucketDict, uuid, file.getFileFormat()))
|
||||||
|
.targetKey(uuid)
|
||||||
|
.targetChannelCode(targetChannelCode)
|
||||||
|
.targetFileName(fileName)
|
||||||
|
.file(file)
|
||||||
|
.fileUuid(fileCopyObjectRequest.getFileUuid())
|
||||||
|
.appChannelBucketNo(appChannelBucketNo)
|
||||||
|
.appCode(appCode)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
package cn.axzo.oss.manager.api.dto.request;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xudawei@axzo.cn
|
||||||
|
* @date 2025/3/20
|
||||||
|
* @description FileBusinessSceneDto
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class FileBusinessSceneDto {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 应用编码
|
||||||
|
*/
|
||||||
|
private String appCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务场景
|
||||||
|
*/
|
||||||
|
private String businessScene;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
package cn.axzo.oss.manager.api.dto.request;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xudawei@axzo.cn
|
||||||
|
* @date 2025/3/10
|
||||||
|
* @description 对象复制DTO
|
||||||
|
*/
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class FileCopyObjectDto {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 唯一标识
|
||||||
|
* 没有唯一标识,可以与fileKey一致
|
||||||
|
*/
|
||||||
|
private String fileUuid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标桶
|
||||||
|
* 如果目标桶为空,则默认取源桶
|
||||||
|
*/
|
||||||
|
private String targetBucketName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标目录
|
||||||
|
* 如果目标目录为空,则默认在源目录同级
|
||||||
|
*/
|
||||||
|
private String targetDict;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标通道
|
||||||
|
* 如果目标通道为空,则默认源通道
|
||||||
|
*/
|
||||||
|
private String targetChannelCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名称
|
||||||
|
*/
|
||||||
|
private String targetFileName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 桶名称
|
||||||
|
*/
|
||||||
|
private String srcBucketName;
|
||||||
|
/**
|
||||||
|
* 桶文件目录
|
||||||
|
*/
|
||||||
|
private String srcBucketKey;
|
||||||
|
/**
|
||||||
|
* 文件对象key
|
||||||
|
*/
|
||||||
|
private String srcFileKey;
|
||||||
|
|
||||||
|
}
|
||||||
@ -5,9 +5,7 @@ import lombok.Builder;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
import javax.validation.constraints.NotBlank;
|
|
||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.NotEmpty;
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import javax.validation.constraints.Size;
|
import javax.validation.constraints.Size;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|||||||
@ -67,4 +67,9 @@ public class SignUrlUploadDto {
|
|||||||
* 桶key
|
* 桶key
|
||||||
*/
|
*/
|
||||||
private String bucketKey;
|
private String bucketKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件key
|
||||||
|
*/
|
||||||
|
private String fileKey;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,55 @@
|
|||||||
|
package cn.axzo.oss.manager.api.dto.request.file;
|
||||||
|
|
||||||
|
import cn.axzo.oss.dal.entity.File;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xudawei@axzo.cn
|
||||||
|
* @date 2025/3/12
|
||||||
|
* @description 更新文件信息
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class UpdateFileInfoDto {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件Id
|
||||||
|
*/
|
||||||
|
private Long fileId;
|
||||||
|
/**
|
||||||
|
* 文件fileKey
|
||||||
|
*/
|
||||||
|
private String fileKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 需要更新属性
|
||||||
|
*/
|
||||||
|
private UpdateFileInfo updateFileInfo;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public static class UpdateFileInfo {
|
||||||
|
/**
|
||||||
|
* 文件名称
|
||||||
|
*/
|
||||||
|
private String fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建文件
|
||||||
|
*/
|
||||||
|
public static File create(Long id, UpdateFileInfo updateFileInfo){
|
||||||
|
File file = new File();
|
||||||
|
file.setId(id);
|
||||||
|
file.setFileName(updateFileInfo.getFileName());
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
package cn.axzo.oss.manager.api.dto.response;
|
||||||
|
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.CopyObjectCloudDto;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xudawei@axzo.cn
|
||||||
|
* @date 2025/3/10
|
||||||
|
* @description 对象复制DTO
|
||||||
|
*/
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class FileCopyObjectResponse {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 唯一标识,没有唯一标识,可以与fileKey一致
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "唯一性标识不能为空")
|
||||||
|
private String fileUuid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标桶
|
||||||
|
* 如果目标桶为空,则默认取源桶
|
||||||
|
*/
|
||||||
|
private String targetFileKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标通道
|
||||||
|
* 如果目标通道为空,则默认源通道
|
||||||
|
*/
|
||||||
|
private String targetChannelCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 桶名称
|
||||||
|
*/
|
||||||
|
private String srcBucketName;
|
||||||
|
/**
|
||||||
|
* 桶文件目录
|
||||||
|
*/
|
||||||
|
private String srcBucketDict;
|
||||||
|
/**
|
||||||
|
* 文件对象key
|
||||||
|
*/
|
||||||
|
private String srcFileKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名称
|
||||||
|
*/
|
||||||
|
private String srcFileName;
|
||||||
|
|
||||||
|
public static FileCopyObjectResponse create(CopyObjectCloudDto item) {
|
||||||
|
return FileCopyObjectResponse.builder()
|
||||||
|
.fileUuid(item.getFileUuid())
|
||||||
|
.targetFileKey(item.getTargetKey())
|
||||||
|
.targetChannelCode(item.getTargetChannelCode())
|
||||||
|
// .targetDownloadUrl(this.fileManager.fetchDownloadUrl(item.getFile().getb))
|
||||||
|
.srcBucketName(item.getFile().getBucketName())
|
||||||
|
.srcBucketDict(item.getFile().getDirectory())
|
||||||
|
.srcFileKey(item.getFile().getFileUuid())
|
||||||
|
.srcFileName(item.getTargetFileName())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -4,10 +4,10 @@ import cn.axzo.oss.common.enums.CodeEnum;
|
|||||||
import cn.axzo.oss.common.exception.BizException;
|
import cn.axzo.oss.common.exception.BizException;
|
||||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||||
import cn.axzo.oss.dal.repository.FileBusinessSceneDao;
|
import cn.axzo.oss.dal.repository.FileBusinessSceneDao;
|
||||||
|
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||||
import cn.axzo.oss.manager.api.FileBusinessSceneManager;
|
import cn.axzo.oss.manager.api.FileBusinessSceneManager;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
@ -53,4 +53,9 @@ public class FileBusinessSceneManagerImpl implements FileBusinessSceneManager {
|
|||||||
return fileBusinessSceneDao
|
return fileBusinessSceneDao
|
||||||
.queryByBucketNoAndScene(bucketNoList, bizScene);
|
.queryByBucketNoAndScene(bucketNoList, bizScene);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo) {
|
||||||
|
return fileBusinessSceneDao.findByCondition(vo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,12 +12,15 @@ import cn.axzo.oss.integration.s3.AliOssService;
|
|||||||
import cn.axzo.oss.integration.s3.HuaWeiCloudService;
|
import cn.axzo.oss.integration.s3.HuaWeiCloudService;
|
||||||
import cn.axzo.oss.manager.api.FileManager;
|
import cn.axzo.oss.manager.api.FileManager;
|
||||||
import cn.axzo.oss.manager.api.dto.PartETag;
|
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.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.ManaGetObjectMetaResponse;
|
||||||
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
||||||
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
||||||
import com.alibaba.fastjson.JSON;
|
|
||||||
import com.aliyun.oss.model.SimplifiedObjectMeta;
|
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.ObjectMetadata;
|
||||||
import com.obs.services.model.TemporarySignatureResponse;
|
import com.obs.services.model.TemporarySignatureResponse;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -32,7 +35,10 @@ import java.io.ByteArrayInputStream;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author admin
|
* @Author admin
|
||||||
@ -346,4 +352,98 @@ public class FileManagerImpl implements FileManager {
|
|||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean copyObjects(CopyObjectCloudDto dto) {
|
||||||
|
// 相同的通道-对象复制
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 相同的通道-对象复制
|
||||||
|
*/
|
||||||
|
public Boolean copyObjectWhenSameChannel(CopyObjectCloudDto dto) {
|
||||||
|
ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(dto.getSrcChannelCode());
|
||||||
|
switch (typeEnum) {
|
||||||
|
case OBS:// 华为云
|
||||||
|
CopyObjectResult huaweiResult = huaWeiCloudService.copyObject(dto.getSrcBucketName(), dto.getSrcBucketKey(), dto.getTargetBucketName(), dto.getTargetBucketKey());
|
||||||
|
return Objects.isNull(huaweiResult) ? false : true;
|
||||||
|
case OSS:// 阿里云
|
||||||
|
com.aliyun.oss.model.CopyObjectResult aliResult = aliOssService.copyObject(dto.getSrcBucketName(), dto.getSrcBucketKey(), dto.getTargetBucketName(), dto.getTargetKey());
|
||||||
|
return Objects.isNull(aliResult) ? false : true;
|
||||||
|
default:
|
||||||
|
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);
|
||||||
|
}
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,9 @@ package cn.axzo.oss.service.api;
|
|||||||
import cn.axzo.framework.auth.domain.ContextInfo;
|
import cn.axzo.framework.auth.domain.ContextInfo;
|
||||||
import cn.axzo.oss.dal.entity.AppChannelBucket;
|
import cn.axzo.oss.dal.entity.AppChannelBucket;
|
||||||
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.AppInfoDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto;
|
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
|
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
|
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.GetObjectMetaDto;
|
import cn.axzo.oss.manager.api.dto.request.GetObjectMetaDto;
|
||||||
@ -16,6 +18,9 @@ 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.ServerFileUploadDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
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.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;
|
import cn.axzo.oss.manager.api.dto.response.FileInformationResponse;
|
||||||
import cn.axzo.oss.manager.api.dto.response.FindFileKeyResponse;
|
import cn.axzo.oss.manager.api.dto.response.FindFileKeyResponse;
|
||||||
import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse;
|
import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse;
|
||||||
@ -117,4 +122,21 @@ public interface FileService {
|
|||||||
* 授权给第三方下载
|
* 授权给第三方下载
|
||||||
*/
|
*/
|
||||||
List<SignUrlDownloadResponse> signUrlDownloadNoFile(SignUrlDownloadDto dto);
|
List<SignUrlDownloadResponse> signUrlDownloadNoFile(SignUrlDownloadDto dto);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制文件
|
||||||
|
* 1 不同通道,则通过url进行复制
|
||||||
|
* 2 相同通道,则直接调用复制方法
|
||||||
|
*/
|
||||||
|
List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件信息
|
||||||
|
*/
|
||||||
|
boolean updateFileInfo(UpdateFileInfoDto updateFileInfoDto);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除文件信息
|
||||||
|
*/
|
||||||
|
void deleteObject(DeleteObjectsFileDto dto);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package cn.axzo.oss.service.impl;
|
package cn.axzo.oss.service.impl;
|
||||||
|
|
||||||
|
import cn.axzo.basics.common.util.AssertUtil;
|
||||||
import cn.axzo.core.utils.converter.BeanConverter;
|
import cn.axzo.core.utils.converter.BeanConverter;
|
||||||
import cn.axzo.framework.auth.domain.ContextInfo;
|
import cn.axzo.framework.auth.domain.ContextInfo;
|
||||||
import cn.axzo.log.platform.client.LogPlatClient;
|
import cn.axzo.log.platform.client.LogPlatClient;
|
||||||
@ -25,13 +26,17 @@ import cn.axzo.oss.dal.entity.FileBusinessScene;
|
|||||||
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
||||||
import cn.axzo.oss.dal.repository.FileAppDao;
|
import cn.axzo.oss.dal.repository.FileAppDao;
|
||||||
import cn.axzo.oss.dal.repository.FileDao;
|
import cn.axzo.oss.dal.repository.FileDao;
|
||||||
|
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||||
import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig;
|
import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig;
|
||||||
import cn.axzo.oss.manager.api.AppChannelBucketManager;
|
import cn.axzo.oss.manager.api.AppChannelBucketManager;
|
||||||
import cn.axzo.oss.manager.api.FileBusinessSceneManager;
|
import cn.axzo.oss.manager.api.FileBusinessSceneManager;
|
||||||
import cn.axzo.oss.manager.api.FileManager;
|
import cn.axzo.oss.manager.api.FileManager;
|
||||||
import cn.axzo.oss.manager.api.FileUploadConfigManager;
|
import cn.axzo.oss.manager.api.FileUploadConfigManager;
|
||||||
import cn.axzo.oss.manager.api.dto.PartETag;
|
import cn.axzo.oss.manager.api.dto.PartETag;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.AppInfoDto;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.CopyObjectCloudDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto;
|
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto;
|
||||||
|
import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
|
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
|
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.GetObjectMetaDto;
|
import cn.axzo.oss.manager.api.dto.request.GetObjectMetaDto;
|
||||||
@ -44,6 +49,9 @@ 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.ServerFileUploadDto;
|
||||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
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.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;
|
import cn.axzo.oss.manager.api.dto.response.FileInformationResponse;
|
||||||
import cn.axzo.oss.manager.api.dto.response.FindFileKeyResponse;
|
import cn.axzo.oss.manager.api.dto.response.FindFileKeyResponse;
|
||||||
import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse;
|
import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse;
|
||||||
@ -54,11 +62,9 @@ import cn.axzo.oss.manager.api.dto.response.ServerFileDownloadResponse;
|
|||||||
import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse;
|
import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse;
|
||||||
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
||||||
import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse;
|
import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse;
|
||||||
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
|
||||||
import cn.axzo.oss.service.api.FileService;
|
import cn.axzo.oss.service.api.FileService;
|
||||||
import cn.axzo.oss.service.metafile.WithFileFactory;
|
import cn.axzo.oss.service.metafile.WithFileFactory;
|
||||||
import cn.axzo.oss.service.metafile.WithFileService;
|
import cn.axzo.oss.service.metafile.WithFileService;
|
||||||
import cn.azxo.framework.common.model.CommonResponse;
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.lang.Pair;
|
import cn.hutool.core.lang.Pair;
|
||||||
@ -89,6 +95,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static cn.axzo.oss.common.constans.CommonConstants.APP_PRO_BUCKET_NAME;
|
import static cn.axzo.oss.common.constans.CommonConstants.APP_PRO_BUCKET_NAME;
|
||||||
@ -1258,4 +1265,249 @@ public class FileServiceImpl implements FileService {
|
|||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制文件
|
||||||
|
* 1 不同通道,则通过url进行复制
|
||||||
|
* 2 相同通道,则直接调用复制方法
|
||||||
|
*/
|
||||||
|
public List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto) {
|
||||||
|
AssertUtil.isFalse(CollectionUtils.isEmpty(dtoList), "请求入参为空");
|
||||||
|
//校验appCode
|
||||||
|
this.checkAppCode(appInfoDto.getAppCode());
|
||||||
|
//通过fileKeys复制文件
|
||||||
|
List<CopyObjectCloudDto> cloudDtos = this.batchCopyObjectByFileKeys(dtoList, appInfoDto);
|
||||||
|
//保存文件表
|
||||||
|
return this.saveFiles(cloudDtos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存文件表
|
||||||
|
*/
|
||||||
|
private List<FileCopyObjectResponse> saveFiles(List<CopyObjectCloudDto> cloudDtos) {
|
||||||
|
List<FileCopyObjectResponse> responses = new ArrayList<>();
|
||||||
|
|
||||||
|
List<File> fileList = cloudDtos.stream().map(item -> {
|
||||||
|
//复制文件-构建file对象
|
||||||
|
File ossFile = this.buildFileWhenCopyObject(item);
|
||||||
|
//构建返回对象
|
||||||
|
responses.add(FileCopyObjectResponse.create(item));
|
||||||
|
return ossFile;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
if (CollectionUtil.isEmpty(cloudDtos)) {
|
||||||
|
return Lists.newArrayList();
|
||||||
|
}
|
||||||
|
this.fileDao.saveBatch(fileList);
|
||||||
|
return responses;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制文件-构建file对象
|
||||||
|
*/
|
||||||
|
private File buildFileWhenCopyObject(CopyObjectCloudDto item) {
|
||||||
|
File ossFile = new File();
|
||||||
|
ossFile.setAppChannelBucketNo(item.getAppChannelBucketNo());
|
||||||
|
ossFile.setAppCode(item.getAppCode());
|
||||||
|
ossFile.setChannelCode(item.getTargetChannelCode());
|
||||||
|
ossFile.setBucketName(item.getTargetBucketName());
|
||||||
|
ossFile.setDirectory(item.getTargetBucketDict());
|
||||||
|
ossFile.setStorageUnit(item.getFile().getStorageUnit());
|
||||||
|
ossFile.setStorageSize(item.getFile().getStorageSize());
|
||||||
|
ossFile.setFileFormat(item.getFile().getFileFormat());
|
||||||
|
ossFile.setFileUuid(item.getTargetKey());
|
||||||
|
ossFile.setFileUrl(this.fileManager.fetchDownloadUrl(item.getTargetBucketName(), Utility.generateFileKey(item.getTargetBucketKey(), item.getTargetKey(), item.getFile().getFileFormat()), item.getTargetChannelCode()));
|
||||||
|
ossFile.setUrlMd5(Utility.getMd5(ossFile.getFileUrl()));
|
||||||
|
ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode());
|
||||||
|
ossFile.setFileName(item.getTargetFileName());
|
||||||
|
ossFile.setFileMd5(Utility.getMd5(ossFile.getFileUrl()));
|
||||||
|
return ossFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过fileKeys复制文件
|
||||||
|
*/
|
||||||
|
private List<CopyObjectCloudDto> batchCopyObjectByFileKeys(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto) {
|
||||||
|
List<String> fileKeys = dtoList.stream()
|
||||||
|
.filter(item -> StringUtils.isNotBlank(item.getSrcFileKey()))
|
||||||
|
.map(FileCopyObjectDto::getSrcFileKey).collect(Collectors.toList());
|
||||||
|
|
||||||
|
Map<String, FileCopyObjectDto> reqFileKeyMap = dtoList.stream()
|
||||||
|
.filter(item -> StringUtils.isNotBlank(item.getSrcFileKey()))
|
||||||
|
.collect(Collectors.toMap(item -> item.getSrcFileKey(), Function.identity()));
|
||||||
|
//查询file数据表获取源对象
|
||||||
|
List<File> fileList = fileDao.getByFileUuids(fileKeys);
|
||||||
|
|
||||||
|
if (CollectionUtil.isEmpty(fileList)) {
|
||||||
|
return Lists.newArrayList();
|
||||||
|
}
|
||||||
|
//通过文件表,完成文件对象复制
|
||||||
|
return this.doBatchCopyObjectByFiles(reqFileKeyMap, fileList, appInfoDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过文件表-文件对象复制
|
||||||
|
* 注意,此方法是根据业务文件复制
|
||||||
|
* 底层通用方法fileManager.copyObjects(dto);
|
||||||
|
*/
|
||||||
|
private List<CopyObjectCloudDto> doBatchCopyObjectByFiles(Map<String, FileCopyObjectDto> reqFileKeyMap, List<File> fileList, AppInfoDto appInfoDto) {
|
||||||
|
List<CopyObjectCloudDto> returnList = Lists.newArrayList();
|
||||||
|
// key:appCode的对象
|
||||||
|
// value:targetAppCode的对象
|
||||||
|
Pair<FileBusinessScene, FileBusinessScene> pair = this.checkBatchCopyObject(appInfoDto);
|
||||||
|
|
||||||
|
for (File file : fileList) {
|
||||||
|
if (Objects.isNull(reqFileKeyMap.get(file.getFileUuid()))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
FileCopyObjectDto fileCopyObjectRequest = reqFileKeyMap.get(file.getFileUuid());
|
||||||
|
if (Objects.isNull(fileCopyObjectRequest)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file, pair.getKey(), pair.getValue());
|
||||||
|
|
||||||
|
this.fileManager.copyObjects(dto);
|
||||||
|
returnList.add(dto);
|
||||||
|
}
|
||||||
|
return returnList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pair<FileBusinessScene,FileBusinessScene> checkBatchCopyObject(AppInfoDto appInfoDto) {
|
||||||
|
FileBusinessScene fileBusinessScene = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto.getAppCode(), appInfoDto.getBizScene());
|
||||||
|
FileBusinessScene targetFileBiz = null;
|
||||||
|
if (StringUtils.isNotBlank(appInfoDto.getTargetAppCode()) && StringUtils.isNotBlank(appInfoDto.getTargetBizScene())) {
|
||||||
|
targetFileBiz = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto.getTargetAppCode(), appInfoDto.getTargetBizScene());
|
||||||
|
BizException.error(Utility.objIsNotNull(targetFileBiz), CodeEnum.FILE_TARGET_APP_IS_EMPTY);
|
||||||
|
}
|
||||||
|
return Pair.of(fileBusinessScene, targetFileBiz);
|
||||||
|
}
|
||||||
|
|
||||||
|
private FileBusinessScene fetchBizSceneByAppCodeAndBizScene(String appCode, String bizScene) {
|
||||||
|
List<FileBusinessScene> list = this.fileBusinessSceneManager.findByCondition(FileBusinessSceneVo.builder()
|
||||||
|
.appCode(appCode)
|
||||||
|
.businessScene(bizScene)
|
||||||
|
.build());
|
||||||
|
AssertUtil.notEmpty(list, "文件业务场景未配置");
|
||||||
|
AssertUtil.isFalse(list.size() > 1, "文件业务场景匹配多个");
|
||||||
|
return list.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新文件信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean updateFileInfo(UpdateFileInfoDto updateFileInfoDto) {
|
||||||
|
//构建需要更新的信息
|
||||||
|
//1 fileId有值,则用fileId直接更新文件信息
|
||||||
|
//2 fileId无值,fileKey有值,则用fileKey查询file信息
|
||||||
|
File file = this.buildUpdateFileInfo(updateFileInfoDto);
|
||||||
|
if (Objects.isNull(file)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return this.fileDao.updateFileById(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建需要更新的信息
|
||||||
|
* 1 fileId有值,则用fileId直接更新文件信息
|
||||||
|
* 2 fileId无值,fileKey有值,则用fileKey查询file信息
|
||||||
|
*/
|
||||||
|
private File buildUpdateFileInfo(UpdateFileInfoDto updateFileInfoDto) {
|
||||||
|
//fileId有值,则用fileId直接更新文件信息
|
||||||
|
if (Objects.nonNull(updateFileInfoDto.getFileId())) {
|
||||||
|
return UpdateFileInfoDto.create(updateFileInfoDto.getFileId(), updateFileInfoDto.getUpdateFileInfo());
|
||||||
|
} else {
|
||||||
|
//fileId无值,fileKey有值,则用fileKey查询file信息
|
||||||
|
//根据查询file信息更新文件
|
||||||
|
if (StringUtils.isNotBlank(updateFileInfoDto.getFileKey())) {
|
||||||
|
File byFileUuid = this.fileDao.getByFileUuid(updateFileInfoDto.getFileKey());
|
||||||
|
if (Objects.isNull(byFileUuid)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return UpdateFileInfoDto.create(byFileUuid.getId(), updateFileInfoDto.getUpdateFileInfo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,6 +37,10 @@ public class HandleFileService extends WithFileService{
|
|||||||
|
|
||||||
public SignUrlUploadResponse doSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket, String fileFormat) {
|
public SignUrlUploadResponse doSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket, String fileFormat) {
|
||||||
String uuid = Utility.getUUID();
|
String uuid = Utility.getUUID();
|
||||||
|
//如果fileKey不为空,则以fileKey为准
|
||||||
|
if (StringUtils.isNotBlank(dto.getFileKey())) {
|
||||||
|
uuid = dto.getFileKey();
|
||||||
|
}
|
||||||
// 生成上传文件的唯一key
|
// 生成上传文件的唯一key
|
||||||
String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileFormat);
|
String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileFormat);
|
||||||
// 失效时间
|
// 失效时间
|
||||||
@ -68,24 +72,28 @@ public class HandleFileService extends WithFileService{
|
|||||||
|
|
||||||
private File saveOssFile(FileUploadConfig fileUploadConfig, String fileName, String fileConform, String uuid,
|
private File saveOssFile(FileUploadConfig fileUploadConfig, String fileName, String fileConform, String uuid,
|
||||||
String fileUrl, String fileMd5, Long expiration) {
|
String fileUrl, String fileMd5, Long expiration) {
|
||||||
File ossFile = new File();
|
File byFileUuid = this.fileDao.getByFileUuid(uuid);
|
||||||
ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo());
|
if (Objects.isNull(byFileUuid) || Objects.isNull(byFileUuid.getId())) {
|
||||||
ossFile.setAppCode(fileUploadConfig.getAppCode());
|
File ossFile = new File();
|
||||||
ossFile.setChannelCode(fileUploadConfig.getChannelCode());
|
ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo());
|
||||||
ossFile.setBucketName(fileUploadConfig.getBucketName());
|
ossFile.setAppCode(fileUploadConfig.getAppCode());
|
||||||
ossFile.setDirectory(fileUploadConfig.getDirectory());
|
ossFile.setChannelCode(fileUploadConfig.getChannelCode());
|
||||||
ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode());
|
ossFile.setBucketName(fileUploadConfig.getBucketName());
|
||||||
ossFile.setStorageUnit(fileUploadConfig.getStorageUnit());
|
ossFile.setDirectory(fileUploadConfig.getDirectory());
|
||||||
ossFile.setStorageSize(fileUploadConfig.getStorageSize());
|
ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode());
|
||||||
ossFile.setFileFormat(fileConform);
|
ossFile.setStorageUnit(fileUploadConfig.getStorageUnit());
|
||||||
ossFile.setFileUuid(uuid);
|
ossFile.setStorageSize(fileUploadConfig.getStorageSize());
|
||||||
ossFile.setFileUrl(fileUrl);
|
ossFile.setFileFormat(fileConform);
|
||||||
ossFile.setUrlMd5(Utility.getMd5(fileUrl));
|
ossFile.setFileUuid(uuid);
|
||||||
ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode());
|
ossFile.setFileUrl(fileUrl);
|
||||||
ossFile.setFileName(fileName);
|
ossFile.setUrlMd5(Utility.getMd5(fileUrl));
|
||||||
ossFile.setFileMd5(fileMd5);
|
ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode());
|
||||||
fileDao.save(ossFile);
|
ossFile.setFileName(fileName);
|
||||||
return ossFile;
|
ossFile.setFileMd5(fileMd5);
|
||||||
|
fileDao.save(ossFile);
|
||||||
|
return ossFile;
|
||||||
|
}
|
||||||
|
return byFileUuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user