临时授权加上-不保存file至本地db
This commit is contained in:
parent
3d26392123
commit
8bb392446f
@ -137,6 +137,15 @@ public class ServerFileController implements ServerFileServiceApi {
|
||||
return CommonResponse.success(BeanConverter.convert(fileService.signUrlDownload(dto), ApiSignUrlDownloadResponse.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 授权给第三方下载-生成临时url
|
||||
*/
|
||||
@Override
|
||||
public CommonResponse<List<ApiSignUrlDownloadResponse>> signUrlFetchDownloadNoFile(@Valid @RequestBody ApiSignUrlDownloadRequest request) {
|
||||
SignUrlDownloadDto dto = BeanConvertUtil.copyBean(request, SignUrlDownloadDto.class);
|
||||
return CommonResponse.success(BeanConverter.convert(fileService.signUrlDownloadNoFile(dto), ApiSignUrlDownloadResponse.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 授权给第三方上传-生成临时url
|
||||
*/
|
||||
|
||||
@ -20,9 +20,11 @@ import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadV2Request;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -81,6 +83,14 @@ public interface ServerFileServiceApi {
|
||||
@RequestMapping(value = "api/signUrl/fetchDownload", method = RequestMethod.POST)
|
||||
CommonResponse<List<ApiSignUrlDownloadResponse>> signUrlFetchDownload(ApiSignUrlDownloadRequest request);
|
||||
|
||||
/**
|
||||
* 临时授权下载-生成临时url
|
||||
*/
|
||||
@RequestMapping(value = "api/signUrl/fetchDownloadNoFile", method = RequestMethod.POST)
|
||||
CommonResponse<List<ApiSignUrlDownloadResponse>> signUrlFetchDownloadNoFile(@Valid @RequestBody ApiSignUrlDownloadRequest request);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 临时授权上传-生成临时url
|
||||
*/
|
||||
|
||||
@ -32,6 +32,11 @@ public class ApiSignUrlDownloadRequest {
|
||||
*/
|
||||
private String bizScene;
|
||||
|
||||
/**
|
||||
* bizScene,对应目录
|
||||
*/
|
||||
private String appCode;
|
||||
|
||||
/**
|
||||
* 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30
|
||||
*/
|
||||
|
||||
@ -61,4 +61,8 @@ public class ApiSignUrlUploadRequest {
|
||||
* 是否带上文件名称
|
||||
*/
|
||||
private Boolean hasFileName = true;
|
||||
/**
|
||||
* 桶key
|
||||
*/
|
||||
private String bucketKey;
|
||||
}
|
||||
|
||||
@ -34,6 +34,8 @@ public class SignUrlDownloadDto {
|
||||
*/
|
||||
private String bizScene;
|
||||
|
||||
private String appCode;
|
||||
|
||||
/**
|
||||
* 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30
|
||||
*/
|
||||
|
||||
@ -62,4 +62,9 @@ public class SignUrlUploadDto {
|
||||
* 是否带上文件名称
|
||||
*/
|
||||
private Boolean hasFileName = true;
|
||||
|
||||
/**
|
||||
* 桶key
|
||||
*/
|
||||
private String bucketKey;
|
||||
}
|
||||
|
||||
@ -92,4 +92,9 @@ public interface FileService {
|
||||
* 元数据
|
||||
*/
|
||||
ManaGetObjectMetaResponse getObjectMeta(String bucketName, String key, String url,String channelCode);
|
||||
|
||||
/**
|
||||
* 授权给第三方下载
|
||||
*/
|
||||
List<SignUrlDownloadResponse> signUrlDownloadNoFile(SignUrlDownloadDto dto);
|
||||
}
|
||||
|
||||
@ -54,6 +54,8 @@ import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
|
||||
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.metafile.WithFileFactory;
|
||||
import cn.axzo.oss.service.metafile.WithFileService;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
@ -133,8 +135,8 @@ public class FileServiceImpl implements FileService {
|
||||
@Value("${sign.url.download.expire.second:2000}")
|
||||
private Long SIGN_URL_DOWNLOAD_EXPIRE_SECOND;
|
||||
|
||||
@Value("${sign.url.upload.expire.second:2000}")
|
||||
private Long SIGN_URL_UPLOAD_EXPIRE_SECOND;
|
||||
@Autowired
|
||||
private WithFileFactory withFileFactory;
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
@ -892,29 +894,46 @@ public class FileServiceImpl implements FileService {
|
||||
// bucket下的key
|
||||
String tgtFileKey = Utility.generateFileKey(item.getDirectory(), item.getFileUuid(), item.getFileFormat());
|
||||
String bucketType = StringUtils.isNotBlank(bucketTypeMap.get(item.getAppChannelBucketNo())) ? bucketTypeMap.get(item.getAppChannelBucketNo()) : BucketTypeEnum.PRIVATE_BUCKET.getCode();
|
||||
switch (BucketTypeEnum.getByCode(bucketType)) {
|
||||
case PUBLIC_BUCKET://公有桶 - 永久链接,例如 http://xxx.png
|
||||
String url = this.fileManager.fetchDownloadUrl(item.getBucketName(), tgtFileKey, item.getChannelCode());
|
||||
return SignUrlDownloadResponse.builder()
|
||||
.signUrl(this.buildPublicXImageProcess(url, style))
|
||||
.fileKey(item.getFileUuid())
|
||||
.fileName(item.getFileName())
|
||||
.build();
|
||||
case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d
|
||||
String signUrl = this.fileManager.signUrlDownload(item.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , item.getChannelCode(), item.getFileName(), style, hasFileName);
|
||||
return SignUrlDownloadResponse.builder()
|
||||
.signUrl(UrlUtil.httpToHttps(signUrl))
|
||||
.fileKey(item.getFileUuid())
|
||||
.fileName(item.getFileName())
|
||||
.build();
|
||||
default:
|
||||
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);
|
||||
}
|
||||
return SignUrlDownloadResponse.builder().build();
|
||||
return this.buildSignUrlDownloadResponse(bucketType, item.getBucketName(), tgtFileKey, item.getChannelCode(), item.getFileUuid(), item.getFileName(), style, hasFileName, expire);
|
||||
}).collect(Collectors.toList());
|
||||
return responseList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建临时授权下载返回对象
|
||||
* @param bucketType 公有桶/私有桶
|
||||
* @param bucketName 桶名称
|
||||
* @param tgtFileKey 桶key
|
||||
* @param channelCode aliyun/huaweicloud
|
||||
* @param fileUuid 文件标识
|
||||
* @param fileName 文件名称
|
||||
* @param style 裁剪样式
|
||||
* @param hasFileName 是否显示文件名称
|
||||
* @param expire 过期时间
|
||||
* @return 临时授权下载返回对象
|
||||
*/
|
||||
private SignUrlDownloadResponse buildSignUrlDownloadResponse(String bucketType, String bucketName, String tgtFileKey, String channelCode, String fileUuid, String fileName, String style, Boolean hasFileName,Long expire) {
|
||||
switch (BucketTypeEnum.getByCode(bucketType)) {
|
||||
case PUBLIC_BUCKET://公有桶 - 永久链接,例如 http://xxx.png
|
||||
String url = this.fileManager.fetchDownloadUrl(bucketName, tgtFileKey, channelCode);//item.getBucketName() item.getChannelCode()
|
||||
return SignUrlDownloadResponse.builder()
|
||||
.signUrl(this.buildPublicXImageProcess(url, style))
|
||||
.fileKey(fileUuid)//item.getFileUuid()
|
||||
.fileName(fileName)//item.getFileName()
|
||||
.build();
|
||||
case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d
|
||||
String signUrl = this.fileManager.signUrlDownload(bucketName, tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName, style, hasFileName);
|
||||
return SignUrlDownloadResponse.builder()
|
||||
.signUrl(UrlUtil.httpToHttps(signUrl))
|
||||
.fileKey(fileUuid)
|
||||
.fileName(fileName)
|
||||
.build();
|
||||
default:
|
||||
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);
|
||||
}
|
||||
return SignUrlDownloadResponse.builder().build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建http链接(非fileKey入参)返回对象
|
||||
*/
|
||||
@ -1058,87 +1077,12 @@ public class FileServiceImpl implements FileService {
|
||||
//操作日志记录
|
||||
operateLog(dto.toString(), dto.getServiceName(), FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext);
|
||||
//3 保存File对象
|
||||
SignUrlUploadResponse response = this.signUrlSaveFile(dto, fileUploadConfig, scene, appChannelBucket);
|
||||
WithFileService withFileService = withFileFactory.getFileService(dto.getBizScene());
|
||||
SignUrlUploadResponse response = withFileService.saveFile(dto, fileUploadConfig, scene, appChannelBucket);
|
||||
log.info("signUrl upload dto = {}, times:{}", JsonUtil.obj2Str(dto), System.currentTimeMillis() - start);
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param dto
|
||||
* @param fileUploadConfig
|
||||
* @return
|
||||
*/
|
||||
private SignUrlUploadResponse signUrlSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket) {
|
||||
String uuid = Utility.getUUID();
|
||||
|
||||
int lastIndexOf = dto.getFileName().lastIndexOf(FileClassEnum.DOT.type);
|
||||
BizException
|
||||
.error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT);
|
||||
|
||||
// 是否包含指定格式
|
||||
String fileFormat = dto.getFileName().substring(lastIndexOf + CommonConstants.ONE).toLowerCase();
|
||||
|
||||
// 文件格式判断
|
||||
String[] formats = fileUploadConfig.getFileFormat().split(FileClassEnum.COMMA.type);
|
||||
// 是否包含指定格式
|
||||
BizException.error(Arrays.asList(formats).contains(fileFormat), CodeEnum.FILE_FORMAT_NOT_SUPPORTED);
|
||||
|
||||
// 生成上传文件的唯一key
|
||||
String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileFormat);
|
||||
// 失效时间
|
||||
Long expiration = this.buildExpiration(dto, scene);
|
||||
//1 调用阿里云/华为云 获取临时授权signUrl
|
||||
SignUrlUploadVo signUrlUpload = this.fileManager.signUrlUpload(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),expiration
|
||||
, fileUploadConfig.getChannelCode()
|
||||
, StringUtils.isNotBlank(dto.getContentType()) ? dto.getContentType() : "multipart/form-data", appChannelBucket.getBucketType()
|
||||
, Objects.isNull(dto.getHasFileName()) ? true: dto.getHasFileName() );
|
||||
//2 保存File对象
|
||||
this.saveOssFile(fileUploadConfig, dto.getFileName(), fileFormat, uuid,
|
||||
signUrlUpload.getDownloadSignUrl(), Utility.getMd5(signUrlUpload.getDownloadSignUrl()), expiration);
|
||||
return SignUrlUploadResponse.builder()
|
||||
.signUrl(UrlUtil.httpToHttps(signUrlUpload.getSignUrl()))
|
||||
.fileKey(uuid)
|
||||
.contentType(signUrlUpload.getContentType())
|
||||
.host(signUrlUpload.getHost())
|
||||
.channelCode(signUrlUpload.getChannelCode())
|
||||
.downloadSignUrl(UrlUtil.httpToHttps(signUrlUpload.getDownloadSignUrl()))
|
||||
.fileName(dto.getFileName())
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 临时授权失效时间
|
||||
* 优先从业务入参取值,业务入参失效时间为空,则从oss配置中取失效时间
|
||||
*/
|
||||
private Long buildExpiration(SignUrlUploadDto dto, FileBusinessScene scene) {
|
||||
if (Objects.nonNull(dto) && Objects.nonNull(dto.getExpiration())) {
|
||||
return dto.getExpiration();
|
||||
}
|
||||
return scene.getUploadExpiration();
|
||||
}
|
||||
|
||||
/**
|
||||
* 授权给第三方下载,获取文件上传配置
|
||||
*/
|
||||
private FileUploadConfig signUrlBuildUploadConfig(SignUrlUploadDto dto) {
|
||||
FileUploadConfig fileUploadConfig = new FileUploadConfig();
|
||||
if (Objects.nonNull(dto.getChannelType()) && StringUtils.isNoneBlank(dto.getBucketName()) && StringUtils.isNoneBlank(dto.getBizScene())) {
|
||||
AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCodeChannelCodeBucket(dto.getAppCode(), dto.getChannelType(), dto.getBucketName());
|
||||
|
||||
// 通过渠道桶编码获取到具体文件业务场景
|
||||
FileBusinessScene scene = fileBusinessSceneManager
|
||||
.getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), dto.getBizScene());
|
||||
|
||||
// 通过渠道码和桶名称获取指定上传配置
|
||||
fileUploadConfig = fileUploadConfigManager
|
||||
.getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory());
|
||||
} else {
|
||||
fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), dto.getChannelType());
|
||||
}
|
||||
BizException.isEmpty(Objects.nonNull(fileUploadConfig) || StringUtils.isNotBlank(fileUploadConfig.getAppChannelBucketNo()), CodeEnum.NO_UPLOAD_CONFIG);
|
||||
return fileUploadConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* 授权给第三方-下载
|
||||
@ -1165,4 +1109,23 @@ public class FileServiceImpl implements FileService {
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 授权给第三方下载
|
||||
*/
|
||||
@Override
|
||||
public List<SignUrlDownloadResponse> signUrlDownloadNoFile(SignUrlDownloadDto dto) {
|
||||
// 通过appcode获取文件渠道桶信息
|
||||
AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(dto.getAppCode(), null);
|
||||
|
||||
// 通过渠道桶编码获取到具体文件业务场景
|
||||
FileBusinessScene scene = fileBusinessSceneManager
|
||||
.getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), dto.getBizScene());
|
||||
|
||||
return dto.getFileKeys().stream().map(item ->{
|
||||
//构建返回集合
|
||||
return this.buildSignUrlDownloadResponse(appChannelBucket.getBucketType(), appChannelBucket.getBucketName()
|
||||
, item, appChannelBucket.getChannelCode(), item, null, null, false, scene.getDownloadExpiration());
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,54 @@
|
||||
package cn.axzo.oss.service.metafile;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @Author xudawei@axzo.cn
|
||||
* @Description file工厂
|
||||
* @Date 2024/06/25
|
||||
**/
|
||||
@Service
|
||||
@RefreshScope
|
||||
public class WithFileFactory {
|
||||
|
||||
private Map<String, WithFileService> serviceMap = Maps.newConcurrentMap();
|
||||
|
||||
private static final String DEFAULT_SERVICE = "handleFileService";
|
||||
|
||||
@Value("${ignore.file.biz.scene:attendance,attendance1=ignoreFileService}")
|
||||
private String ignoreFileBizScene;
|
||||
|
||||
public WithFileFactory(List<WithFileService> serviceList) {
|
||||
serviceList.stream().forEach(item -> {
|
||||
serviceMap.put(item.fetchServiceName(), item);
|
||||
});
|
||||
}
|
||||
|
||||
public WithFileService getFileService(String serviceKey) {
|
||||
String serviceName = this.buildServiceName(serviceKey);
|
||||
return Objects.nonNull(serviceMap.get(serviceName)) ? serviceMap.get(serviceName) : serviceMap.get(DEFAULT_SERVICE);
|
||||
}
|
||||
|
||||
private String buildServiceName(String serviceKey) {
|
||||
String[] strs = ignoreFileBizScene.split(";");
|
||||
for (String str : strs) {
|
||||
if (StringUtils.hasText(str) && str.contains(serviceKey)) {
|
||||
return str.split("=")[1];
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public void putService(String serviceName, WithFileService withFileService) {
|
||||
serviceMap.put(serviceName, withFileService);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,61 @@
|
||||
package cn.axzo.oss.service.metafile;
|
||||
|
||||
import cn.axzo.oss.common.constans.CommonConstants;
|
||||
import cn.axzo.oss.common.enums.CodeEnum;
|
||||
import cn.axzo.oss.common.enums.FileClassEnum;
|
||||
import cn.axzo.oss.common.exception.BizException;
|
||||
import cn.axzo.oss.dal.entity.AppChannelBucket;
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @Author xudawei@axzo.cn
|
||||
* @Description file相关
|
||||
* @Date 2024/06/25
|
||||
**/
|
||||
public abstract class WithFileService {
|
||||
|
||||
public SignUrlUploadResponse saveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket) {
|
||||
String fileFormat = this.check(dto, fileUploadConfig);
|
||||
return this.doSaveFile(dto, fileUploadConfig, scene, appChannelBucket, fileFormat);
|
||||
}
|
||||
|
||||
public abstract SignUrlUploadResponse doSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket, String fileFormat);
|
||||
|
||||
public abstract String fetchServiceName();
|
||||
|
||||
/**
|
||||
* 校验
|
||||
*/
|
||||
public String check(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig) {
|
||||
int lastIndexOf = dto.getFileName().lastIndexOf(FileClassEnum.DOT.type);
|
||||
BizException
|
||||
.error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT);
|
||||
|
||||
// 是否包含指定格式
|
||||
String fileFormat = dto.getFileName().substring(lastIndexOf + CommonConstants.ONE).toLowerCase();
|
||||
|
||||
// 文件格式判断
|
||||
String[] formats = fileUploadConfig.getFileFormat().split(FileClassEnum.COMMA.type);
|
||||
// 是否包含指定格式
|
||||
BizException.error(Arrays.asList(formats).contains(fileFormat), CodeEnum.FILE_FORMAT_NOT_SUPPORTED);
|
||||
return fileFormat;
|
||||
}
|
||||
|
||||
/**
|
||||
* 临时授权失效时间
|
||||
* 优先从业务入参取值,业务入参失效时间为空,则从oss配置中取失效时间
|
||||
*/
|
||||
public Long buildExpiration(SignUrlUploadDto dto, FileBusinessScene scene) {
|
||||
if (Objects.nonNull(dto) && Objects.nonNull(dto.getExpiration())) {
|
||||
return dto.getExpiration();
|
||||
}
|
||||
return scene.getUploadExpiration();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,96 @@
|
||||
package cn.axzo.oss.service.metafile.impl;
|
||||
|
||||
import cn.axzo.oss.common.enums.FileStatusEnum;
|
||||
import cn.axzo.oss.common.utils.UrlUtil;
|
||||
import cn.axzo.oss.common.utils.Utility;
|
||||
import cn.axzo.oss.dal.entity.AppChannelBucket;
|
||||
import cn.axzo.oss.dal.entity.File;
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
||||
import cn.axzo.oss.dal.repository.FileDao;
|
||||
import cn.axzo.oss.manager.api.FileManager;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse;
|
||||
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
||||
import cn.axzo.oss.service.metafile.WithFileService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @Author xudawei@axzo.cn
|
||||
* @Description file操作
|
||||
* @Date 2024/06/25
|
||||
**/
|
||||
@Service("handleFileService")
|
||||
@RefreshScope
|
||||
public class HandleFileService extends WithFileService{
|
||||
|
||||
@Autowired
|
||||
private FileManager fileManager;
|
||||
|
||||
@Autowired
|
||||
private FileDao fileDao;
|
||||
|
||||
public SignUrlUploadResponse doSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket, String fileFormat) {
|
||||
String uuid = Utility.getUUID();
|
||||
// 生成上传文件的唯一key
|
||||
String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileFormat);
|
||||
// 失效时间
|
||||
Long expiration = this.buildExpiration(dto, scene);
|
||||
//1 调用阿里云/华为云 获取临时授权signUrl
|
||||
SignUrlUploadVo signUrlUpload = this.fileManager.signUrlUpload(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),expiration
|
||||
, fileUploadConfig.getChannelCode()
|
||||
, StringUtils.isNotBlank(dto.getContentType()) ? dto.getContentType() : "multipart/form-data", appChannelBucket.getBucketType()
|
||||
, Objects.isNull(dto.getHasFileName()) ? true: dto.getHasFileName() );
|
||||
//2 保存File对象
|
||||
this.saveOssFile(fileUploadConfig, dto.getFileName(), fileFormat, uuid,
|
||||
signUrlUpload.getDownloadSignUrl(), Utility.getMd5(signUrlUpload.getDownloadSignUrl()), expiration);
|
||||
return SignUrlUploadResponse.builder()
|
||||
.signUrl(UrlUtil.httpToHttps(signUrlUpload.getSignUrl()))
|
||||
.fileKey(uuid)
|
||||
.contentType(signUrlUpload.getContentType())
|
||||
.host(signUrlUpload.getHost())
|
||||
.channelCode(signUrlUpload.getChannelCode())
|
||||
.downloadSignUrl(UrlUtil.httpToHttps(signUrlUpload.getDownloadSignUrl()))
|
||||
.fileName(dto.getFileName())
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fetchServiceName() {
|
||||
return "handleFileService";
|
||||
}
|
||||
|
||||
|
||||
private File saveOssFile(FileUploadConfig fileUploadConfig, String fileName, String fileConform, String uuid,
|
||||
String fileUrl, String fileMd5, Long expiration) {
|
||||
File ossFile = new File();
|
||||
ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo());
|
||||
ossFile.setAppCode(fileUploadConfig.getAppCode());
|
||||
ossFile.setChannelCode(fileUploadConfig.getChannelCode());
|
||||
ossFile.setBucketName(fileUploadConfig.getBucketName());
|
||||
ossFile.setDirectory(fileUploadConfig.getDirectory());
|
||||
ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode());
|
||||
ossFile.setStorageUnit(fileUploadConfig.getStorageUnit());
|
||||
ossFile.setStorageSize(fileUploadConfig.getStorageSize());
|
||||
ossFile.setFileFormat(fileConform);
|
||||
ossFile.setFileUuid(uuid);
|
||||
ossFile.setFileUrl(fileUrl);
|
||||
ossFile.setUrlMd5(Utility.getMd5(fileUrl));
|
||||
ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode());
|
||||
ossFile.setFileName(fileName);
|
||||
ossFile.setFileMd5(fileMd5);
|
||||
fileDao.save(ossFile);
|
||||
return ossFile;
|
||||
}
|
||||
|
||||
|
||||
// @Override
|
||||
// public void afterPropertiesSet() throws Exception {
|
||||
// withFileFactory.putService("handleFileService", this);
|
||||
// }
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
package cn.axzo.oss.service.metafile.impl;
|
||||
|
||||
import cn.axzo.oss.common.utils.UrlUtil;
|
||||
import cn.axzo.oss.dal.entity.AppChannelBucket;
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
||||
import cn.axzo.oss.manager.api.FileManager;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse;
|
||||
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
||||
import cn.axzo.oss.service.metafile.WithFileService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @Author xudawei@axzo.cn
|
||||
* @Description 忽略file操作
|
||||
* @Date 2024/06/25
|
||||
**/
|
||||
@Service("ignoreFileService")
|
||||
@RefreshScope
|
||||
public class IgnoreFileService extends WithFileService{
|
||||
|
||||
@Autowired
|
||||
private FileManager fileManager;
|
||||
|
||||
|
||||
public SignUrlUploadResponse doSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket,String fileFormat) {
|
||||
|
||||
// 失效时间
|
||||
Long expiration = this.buildExpiration(dto, scene);
|
||||
//1 调用阿里云/华为云 获取临时授权signUrl
|
||||
SignUrlUploadVo signUrlUpload = this.fileManager.signUrlUpload(fileUploadConfig.getBucketName(), dto.getBucketKey(), dto.getFileName(),expiration
|
||||
, fileUploadConfig.getChannelCode()
|
||||
, StringUtils.isNotBlank(dto.getContentType()) ? dto.getContentType() : "multipart/form-data", appChannelBucket.getBucketType()
|
||||
, Objects.isNull(dto.getHasFileName()) ? true: dto.getHasFileName() );
|
||||
return SignUrlUploadResponse.builder()
|
||||
.signUrl(UrlUtil.httpToHttps(signUrlUpload.getSignUrl()))
|
||||
.fileKey(dto.getBucketKey())
|
||||
.contentType(signUrlUpload.getContentType())
|
||||
.host(signUrlUpload.getHost())
|
||||
.channelCode(signUrlUpload.getChannelCode())
|
||||
.downloadSignUrl(UrlUtil.httpToHttps(signUrlUpload.getDownloadSignUrl()))
|
||||
.fileName(dto.getFileName())
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fetchServiceName() {
|
||||
return "ignoreFileService";
|
||||
}
|
||||
|
||||
|
||||
// @Override
|
||||
// public void afterPropertiesSet() throws Exception {
|
||||
// withFileFactory.putService("ignoreFileService", this);
|
||||
// }
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user