加上通过url上传文件
This commit is contained in:
parent
d5e228c9e6
commit
d5c56fd885
@ -14,15 +14,18 @@ import cn.axzo.oss.http.model.FindFileKeyResponse;
|
||||
import cn.axzo.oss.http.model.FindFileUrlRequest;
|
||||
import cn.axzo.oss.http.model.FindFileUrlResponse;
|
||||
import cn.axzo.oss.http.model.ServerFileDeleteRequest;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadByUrlRequest;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadRequest;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadV2Request;
|
||||
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.ServerFileDeleteDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadByUrlDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.service.api.FileByUrlService;
|
||||
import cn.axzo.oss.service.api.FileService;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
@ -47,6 +50,9 @@ public class ServerFileController implements ServerFileServiceApi {
|
||||
@Autowired
|
||||
private FileService fileService;
|
||||
|
||||
@Autowired
|
||||
private FileByUrlService fileByUrlService;
|
||||
|
||||
@Autowired
|
||||
private HttpServletRequest httpServletRequest;
|
||||
|
||||
@ -127,4 +133,18 @@ public class ServerFileController implements ServerFileServiceApi {
|
||||
ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class);
|
||||
return CommonResponse.success(BeanConverter.convert(fileService.signUrlUpload(dto, liteSaasContext), ApiSignUrlUploadResponse.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过URL上传文件
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public CommonResponse<ServerFileUploadResponse> uploadByUrl(@Valid @RequestBody ServerFileUploadByUrlRequest request) {
|
||||
ServerFileUploadByUrlDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadByUrlDto.class);
|
||||
// 获取feign调用请求头携带的用户信息
|
||||
String contextInfoLiteJsonStr = httpServletRequest.getHeader("X-CONTEXT-INFO-LITE");
|
||||
ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class);
|
||||
return CommonResponse.success(BeanConverter.convert(fileByUrlService.uploadByUrl(dto.getAppCode(), dto.getBizScene(), dto.getFileName(), dto.getFileUrl(), dto.getChannelCode(), liteSaasContext), ServerFileUploadResponse.class));
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,6 +26,7 @@ public enum ChannelTypeEnum {
|
||||
private final String channelCode;
|
||||
|
||||
private final static Map<String, ChannelTypeEnum> channelCodeMap = Arrays.stream(ChannelTypeEnum.values()).collect(Collectors.toMap(ChannelTypeEnum::getChannelCode, Function.identity()));
|
||||
private final static Map<Integer, ChannelTypeEnum> codeMap = Arrays.stream(ChannelTypeEnum.values()).collect(Collectors.toMap(ChannelTypeEnum::getCode, Function.identity()));
|
||||
|
||||
ChannelTypeEnum(Integer code, String message, String channelCode) {
|
||||
this.code = code;
|
||||
@ -45,9 +46,16 @@ public enum ChannelTypeEnum {
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过code获取枚举
|
||||
* 通过channelCode获取枚举
|
||||
*/
|
||||
public static ChannelTypeEnum getChannelTypeByChannelCode(String channelCode) {
|
||||
return channelCodeMap.get(channelCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过code获取枚举
|
||||
*/
|
||||
public static ChannelTypeEnum getChannelTypeByCode(Integer code) {
|
||||
return codeMap.get(code);
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ import cn.axzo.oss.http.model.FindFileKeyResponse;
|
||||
import cn.axzo.oss.http.model.FindFileUrlRequest;
|
||||
import cn.axzo.oss.http.model.FindFileUrlResponse;
|
||||
import cn.axzo.oss.http.model.ServerFileDeleteRequest;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadByUrlRequest;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadRequest;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadResponse;
|
||||
import cn.axzo.oss.http.model.ServerFileUploadV2Request;
|
||||
@ -82,4 +83,12 @@ public interface ServerFileServiceApi {
|
||||
@RequestMapping(value = "api/signUrl/fetchUpload", method = RequestMethod.POST)
|
||||
CommonResponse<ApiSignUrlUploadResponse> signUrlFetchUpload(ApiSignUrlUploadRequest request);
|
||||
|
||||
/**
|
||||
* 通过URL上传文件
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping(value = "/api/v1/server/uploadByUrl", method = RequestMethod.POST)
|
||||
CommonResponse<ServerFileUploadResponse> uploadByUrl(ServerFileUploadByUrlRequest request);
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,31 @@
|
||||
package cn.axzo.oss.http.model;
|
||||
|
||||
import lombok.Data;
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 服务端文件上传请求类
|
||||
*
|
||||
* @author zhaoyong
|
||||
* @see ServerFileUploadByUrlRequest
|
||||
* @since 2021-07-23 10:35
|
||||
*/
|
||||
@Data
|
||||
public class ServerFileUploadByUrlRequest {
|
||||
|
||||
@NotBlank(message = "appCode must not be null")
|
||||
private String appCode;
|
||||
@NotBlank(message = "bizScene must not be null")
|
||||
private String bizScene;
|
||||
@NotBlank(message = "fileName must not be null")
|
||||
@Length(max = 128, message = "文件名不能超过128个字符")
|
||||
private String fileName;
|
||||
@NotNull(message = "fileUrl must not be null")
|
||||
private String fileUrl;
|
||||
|
||||
private Integer channelCode;
|
||||
|
||||
}
|
||||
@ -29,4 +29,9 @@ public interface AliOssService extends BaseS3Service {
|
||||
* 获取url
|
||||
*/
|
||||
String getUrl(String bucketName, String tgtFileKey);
|
||||
|
||||
/**
|
||||
* 通过url上传至OBS
|
||||
*/
|
||||
String uploadByUrl(String bucketName, String tgtFileKey, String fileName, String url);
|
||||
}
|
||||
|
||||
@ -40,4 +40,9 @@ public interface HuaWeiCloudService {
|
||||
* 获取url
|
||||
*/
|
||||
String getUrl(String bucketName, String tgtFileKey);
|
||||
|
||||
/**
|
||||
* 通过url上传OBS
|
||||
*/
|
||||
String uploadFileByUrl(String bucketName, String key, String fileName, String url);
|
||||
}
|
||||
|
||||
@ -359,4 +359,29 @@ public class AliOssServiceImpl implements AliOssService {
|
||||
throw new BizException(CodeEnum.DELETE_FILE_FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过url上传至OSS
|
||||
*/
|
||||
@Override
|
||||
public String uploadByUrl(String bucketName, String tgtFileKey, String fileName, String url) {
|
||||
OSS client = aliOssClient.getClient();
|
||||
try {
|
||||
InputStream srcStream = new URL(url).openStream();
|
||||
// 创建上传文件的元信息,通过文件云信息设置HTTP Header
|
||||
ObjectMetadata metadata = new ObjectMetadata();
|
||||
// 设置内容被下载时的名称
|
||||
metadata.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
|
||||
metadata.setContentEncoding("utf-8");
|
||||
client.putObject(bucketName, tgtFileKey, srcStream, metadata);
|
||||
} catch (OSSException e) {
|
||||
LogUtil.error("uploadByStream OSSException", e);
|
||||
return "";
|
||||
} catch (Exception e) {
|
||||
LogUtil.error("uploadByStream ClientException", e);
|
||||
return "";
|
||||
}
|
||||
|
||||
return getUrl(bucketName, tgtFileKey);
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
@ -403,4 +404,28 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
|
||||
|
||||
return allBuilder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过URL上传文件到OBS
|
||||
*/
|
||||
@Override
|
||||
public String uploadFileByUrl(String bucketName, String key, String fileName, String url) {
|
||||
ObsClient obsClient = huaWeiCloudObsClient.getClient();
|
||||
try {
|
||||
InputStream srcStream = new URL(url).openStream();
|
||||
// 创建上传文件的元信息,通过文件云信息设置HTTP Header
|
||||
ObjectMetadata metadata = new ObjectMetadata();
|
||||
// 设置内容被下载时的名称
|
||||
metadata.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
|
||||
metadata.setContentEncoding("utf-8");
|
||||
PutObjectResult putObjectResult = obsClient.putObject(bucketName, key, srcStream, metadata);
|
||||
return putObjectResult.getObjectUrl();
|
||||
} catch (Exception e) {
|
||||
log.error("通过url上传 exception,bucketName:{}, key:{}, fileName:{},url:{}", bucketName, key, fileName, url);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -75,4 +75,10 @@ public interface FileManager {
|
||||
* 根据华为云/阿里云,授权给第三方下载
|
||||
*/
|
||||
String fetchDownloadUrl(String bucketName, String key, String channelCode);
|
||||
|
||||
/**
|
||||
* 通过url上传至云
|
||||
*/
|
||||
String uploadByUrl(String bulkName, String keyPath, String fileName, String url,
|
||||
Integer channelType);
|
||||
}
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
package cn.axzo.oss.manager.api.dto.request;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* @program: oss
|
||||
* @description: 文件上传
|
||||
* @author: mr.jie
|
||||
* @date: 2021-07-29 18:31
|
||||
**/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
public class ServerFileUploadByUrlDto {
|
||||
private String appCode;
|
||||
private String bizScene;
|
||||
private String fileName;
|
||||
private String fileUrl;
|
||||
private String filePath;
|
||||
private Integer channelCode;
|
||||
|
||||
}
|
||||
@ -252,4 +252,26 @@ public class FileManagerImpl implements FileManager {
|
||||
}
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过url上传至云
|
||||
*/
|
||||
public String uploadByUrl(String bulkName, String keyPath, String fileName, String url,
|
||||
Integer channelType) {
|
||||
try {
|
||||
switch (ChannelTypeEnum.getChannelTypeByCode(channelType)) {
|
||||
case OSS:
|
||||
return aliOssService.uploadByUrl(bulkName,keyPath, fileName, url);
|
||||
case OBS:
|
||||
return huaWeiCloudService.uploadFileByUrl(bulkName, keyPath, fileName, url);
|
||||
default:
|
||||
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("通过url上传至云 exception,bulkName:{}, key:{}, fileName:{}, url:{},channelType:{}"
|
||||
, bulkName, keyPath, fileName, url, channelType, e);
|
||||
}
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
package cn.axzo.oss.service.api;
|
||||
|
||||
import cn.axzo.framework.auth.domain.ContextInfo;
|
||||
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto;
|
||||
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.MultipartUploadCompleteDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.MultipartUploadFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.MultipartUploadInitDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.FileInformationResponse;
|
||||
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.MultipartUploadInitResponse;
|
||||
import cn.axzo.oss.manager.api.dto.response.MultipartUploadResponse;
|
||||
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.SignUrlDownloadResponse;
|
||||
import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author admin
|
||||
* @Description
|
||||
* @Date 2021/7/28 22:48
|
||||
* @Version 0.0.1
|
||||
**/
|
||||
public interface FileByUrlService {
|
||||
|
||||
/**
|
||||
* 上传-通过url
|
||||
*/
|
||||
ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url,Integer channelType, ContextInfo.LiteSaasContext liteSaasContext);
|
||||
}
|
||||
@ -0,0 +1,308 @@
|
||||
package cn.axzo.oss.service.impl;
|
||||
|
||||
import cn.axzo.framework.auth.domain.ContextInfo;
|
||||
import cn.axzo.log.platform.client.LogPlatClient;
|
||||
import cn.axzo.log.platform.client.model.OperateLogReq;
|
||||
import cn.axzo.oss.common.constans.CommonConstants;
|
||||
import cn.axzo.oss.common.constans.CommonConstants.FileStatus;
|
||||
import cn.axzo.oss.common.constans.CommonConstants.TableDelete;
|
||||
import cn.axzo.oss.common.enums.BucketTypeEnum;
|
||||
import cn.axzo.oss.common.enums.ChannelTypeEnum;
|
||||
import cn.axzo.oss.common.enums.CodeEnum;
|
||||
import cn.axzo.oss.common.enums.FileClassEnum;
|
||||
import cn.axzo.oss.common.enums.FileDownloadTypeEnum;
|
||||
import cn.axzo.oss.common.enums.FileStatusEnum;
|
||||
import cn.axzo.oss.common.enums.FileUploadTypeEnum;
|
||||
import cn.axzo.oss.common.exception.BizException;
|
||||
import cn.axzo.oss.common.utils.JsonUtil;
|
||||
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.FileApp;
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
||||
import cn.axzo.oss.dal.repository.FileAppDao;
|
||||
import cn.axzo.oss.dal.repository.FileDao;
|
||||
import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig;
|
||||
import cn.axzo.oss.manager.api.AppChannelBucketManager;
|
||||
import cn.axzo.oss.manager.api.FileBusinessSceneManager;
|
||||
import cn.axzo.oss.manager.api.FileManager;
|
||||
import cn.axzo.oss.manager.api.FileUploadConfigManager;
|
||||
import cn.axzo.oss.manager.api.dto.PartETag;
|
||||
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto;
|
||||
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.MultipartUploadCompleteDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.MultipartUploadFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.MultipartUploadInitDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
|
||||
import cn.axzo.oss.manager.api.dto.response.FileInformationResponse;
|
||||
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.MultipartUploadInitResponse;
|
||||
import cn.axzo.oss.manager.api.dto.response.MultipartUploadResponse;
|
||||
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.SignUrlDownloadResponse;
|
||||
import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse;
|
||||
import cn.axzo.oss.manager.api.vo.SignUrlUploadVo;
|
||||
import cn.axzo.oss.service.api.FileByUrlService;
|
||||
import cn.axzo.oss.service.api.FileService;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.oss.common.constans.CommonConstants.APP_PRO_BUCKET_NAME;
|
||||
|
||||
/**
|
||||
* @Author admin
|
||||
* @Description
|
||||
* @Date 2021/7/28 22:48
|
||||
* @Version 0.0.1
|
||||
**/
|
||||
@Service
|
||||
@RefreshScope
|
||||
@Slf4j
|
||||
public class FileByUrlServiceImpl implements FileByUrlService {
|
||||
|
||||
private static final String FILE_UPLOAD_CODE = "OSS_FILE_UPLOAD";
|
||||
private static final String FILE_UPLOAD_NAME = "文件上传";
|
||||
|
||||
@Autowired
|
||||
private FileDao fileDao;
|
||||
|
||||
@Autowired
|
||||
private FileManager fileManager;
|
||||
|
||||
@Autowired
|
||||
private FileAppDao fileAppDao;
|
||||
|
||||
@Autowired
|
||||
private AppChannelBucketManager appChannelBucketManager;
|
||||
|
||||
@Autowired
|
||||
private FileBusinessSceneManager fileBusinessSceneManager;
|
||||
|
||||
@Autowired
|
||||
private FileUploadConfigManager fileUploadConfigManager;
|
||||
|
||||
@Autowired
|
||||
private Environment environment;
|
||||
|
||||
@Autowired
|
||||
private LogPlatClient logPlatClient;
|
||||
|
||||
/**
|
||||
* 通过url上传
|
||||
*/
|
||||
@Override
|
||||
public ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url, Integer channelType, ContextInfo.LiteSaasContext liteSaasContext) {
|
||||
File ossFile = uploadFileAndGetFile(appCode, bizScene, fileName, url, channelType);
|
||||
//操作日志记录
|
||||
operateLog(this.buildUploadParams(appCode, bizScene, fileName, url, channelType), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext);
|
||||
return buildResponse(ossFile);
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作日志记录
|
||||
*/
|
||||
private void operateLog(String param, String serviceName, String featureCode, String featureName, ContextInfo.LiteSaasContext liteSaasContext) {
|
||||
if (liteSaasContext == null || liteSaasContext.getIdentityId() == null || liteSaasContext.getIdentityType() == null) {
|
||||
log.warn("获取用户上下文信息失败");
|
||||
return;
|
||||
}
|
||||
//记录日志
|
||||
try {
|
||||
OperateLogReq log = OperateLogReq.builder()
|
||||
.serviceName(StringUtils.isNotEmpty(serviceName) ? serviceName : environment.getProperty("spring.application.name"))
|
||||
.featureCode(featureCode)
|
||||
.featureName(featureName)
|
||||
.operateTime(new Date())
|
||||
.identityId(liteSaasContext.getIdentityId())
|
||||
.identityType(liteSaasContext.getIdentityType())
|
||||
.operateParam(param)
|
||||
.workspaceId(liteSaasContext.getWorkspaceId())
|
||||
.operateType(1)
|
||||
.build();
|
||||
logPlatClient.createOperateLog(log);
|
||||
} catch (Exception e) {
|
||||
log.warn("服务间调用异常-发送日志失败: errMsg={}.", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传并获取文件
|
||||
*/
|
||||
private File uploadFileAndGetFile(String appCode, String bizScene, String fileName, String url, Integer channelType) {
|
||||
log.info("update channelType:{}, fileName:{}, appCode:{}, bizScene:{}",
|
||||
channelType, fileName, appCode, bizScene);
|
||||
|
||||
FileUploadConfig fileUploadConfig = getFileUploadConfig(appCode, bizScene, channelType);
|
||||
|
||||
// 上传文件并生成file对象
|
||||
return generateFile(fileUploadConfig, appCode, fileName,url, channelType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置信息
|
||||
*/
|
||||
private FileUploadConfig getFileUploadConfig(String appCode, String bizScene, Integer channelType) {
|
||||
// 检查appCode
|
||||
checkAppCode(appCode);
|
||||
|
||||
// 通过appcode获取文件渠道桶信息
|
||||
AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(appCode, channelType);
|
||||
|
||||
// 通过渠道桶编码获取到具体文件业务场景
|
||||
FileBusinessScene scene = fileBusinessSceneManager
|
||||
.getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), bizScene);
|
||||
|
||||
// 通过渠道码和桶名称获取获取指定上传配置
|
||||
FileUploadConfig fileUploadConfig = fileUploadConfigManager
|
||||
.getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory());
|
||||
return fileUploadConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查appCode是否有效
|
||||
*
|
||||
* @param appCode
|
||||
*/
|
||||
private void checkAppCode(final String appCode) {
|
||||
log.info("checkAppCode appCode = {}", appCode);
|
||||
FileApp fileApp = fileAppDao.getByAppCode(appCode);
|
||||
BizException.error(Utility.objIsNotNull(fileApp), CodeEnum.FILE_APP_IS_EMPTY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生产File对象
|
||||
*/
|
||||
private File generateFile(FileUploadConfig fileUploadConfig, String appCode, String fileName, String url, Integer channelType) {
|
||||
|
||||
// 判断容量
|
||||
String fileConform = isFileConform(fileUploadConfig, fileName);
|
||||
String uuid = Utility.getUUID();
|
||||
// 生成上传文件的唯一key
|
||||
String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform);
|
||||
// 上传文件
|
||||
String fileUrl = fileManager.uploadByUrl(fileUploadConfig.getBucketName(), tgtFileKey, fileName, url, channelType);
|
||||
|
||||
// 保存失败
|
||||
if (Utility.isBlank(fileUrl)) {
|
||||
log.error("fileUrl is empty");
|
||||
throw new BizException(CodeEnum.FILE_UPLOAD_FAILED);
|
||||
}
|
||||
|
||||
File file = rebuildOssFile(fileUploadConfig, fileName, fileConform, uuid, fileUrl, Utility.getMd5(url));
|
||||
fileDao.save(file);
|
||||
return file;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param fileUploadConfig
|
||||
* @param fileName
|
||||
* @param fileConform
|
||||
* @param uuid
|
||||
* @param fileUrl
|
||||
* @param fileMd5
|
||||
* @return
|
||||
*/
|
||||
private File rebuildOssFile(FileUploadConfig fileUploadConfig, String fileName, String fileConform, String uuid,
|
||||
String fileUrl, String fileMd5) {
|
||||
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);
|
||||
return ossFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断文件是否符合要求
|
||||
*/
|
||||
private String isFileConform(FileUploadConfig fileUploadConfig, String fileName) {
|
||||
// 文件格式判断
|
||||
String[] formats = fileUploadConfig.getFileFormat().split(FileClassEnum.COMMA.type);
|
||||
|
||||
int lastIndexOf = fileName.lastIndexOf(FileClassEnum.DOT.type);
|
||||
BizException
|
||||
.error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT);
|
||||
|
||||
// 是否包含指定格式
|
||||
String fileFormat = fileName.substring(lastIndexOf + CommonConstants.ONE).toLowerCase();
|
||||
boolean contains = Arrays.asList(formats).contains(fileFormat);
|
||||
BizException.error(contains, CodeEnum.FILE_FORMAT_NOT_SUPPORTED);
|
||||
|
||||
return fileFormat;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建操作日志入参
|
||||
*/
|
||||
private String buildUploadParams(String appCode, String bizScene, String fileName, String url,Integer channelType) {
|
||||
StringBuilder builder = new StringBuilder("appCode:");
|
||||
builder.append(appCode).append(";");
|
||||
builder.append("bizScene").append(":");
|
||||
builder.append(bizScene).append(";");
|
||||
builder.append("fileName").append(":");
|
||||
builder.append(fileName).append(";");
|
||||
builder.append("url").append(":");
|
||||
builder.append(url).append(";");
|
||||
builder.append("channelType").append("");
|
||||
builder.append(channelType).append(";");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建返回对象
|
||||
*/
|
||||
private ServerFileUploadResponse buildResponse(File ossFile) {
|
||||
ServerFileUploadResponse response = new ServerFileUploadResponse();
|
||||
response.setUrl(ossFile.getFileUrl());
|
||||
response.setUrlMd5(ossFile.getUrlMd5());
|
||||
response.setFileKey(ossFile.getFileUuid());
|
||||
return response;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user