Commit 8f440bf8 by zhangxingmin

push

parent 49b4a5d1
#!/bin/bash
# 源端(使用默认配置,无需凭证)
SRC_BUCKET="yd-ali-oss"
# 目标端(香港)
DST_BUCKET="csf-hk"
DST_ENDPOINT="oss-cn-hongkong.aliyuncs.com"
DST_ACCESS_KEY_ID="LTAI5tHS7WBNxN7CwKcWC1Jh"
DST_ACCESS_KEY_SECRET="GaJi5KHqcLOf2lBIFlPKBKDKCECUjo"
# 同步选项
UPDATE_FLAG="--update" # 只同步新增和修改过的文件
LOG_FILE="/root/oss_sync.log"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Start sync" >> ${LOG_FILE}
ossutil sync oss://${SRC_BUCKET}/jpg/ oss://${DST_BUCKET}/pc/prod/ \
-e ${DST_ENDPOINT} -i ${DST_ACCESS_KEY_ID} -k ${DST_ACCESS_KEY_SECRET} \
${UPDATE_FLAG} >> ${LOG_FILE} 2>&1
echo "$(date '+%Y-%m-%d %H:%M:%S') - Sync finished" >> ${LOG_FILE}
\ No newline at end of file
...@@ -35,8 +35,8 @@ public class ApiOssController implements ApiOssFeignClient { ...@@ -35,8 +35,8 @@ public class ApiOssController implements ApiOssFeignClient {
* @return * @return
*/ */
@Override @Override
public Result<ApiUploadResponse> uploadFile(MultipartFile file) { public Result<ApiUploadResponse> uploadFile(MultipartFile file,String projectBizId) {
return apiOssService.uploadFile(file,"","",""); return apiOssService.uploadFile(file,"","","",projectBizId);
} }
/** /**
......
...@@ -11,7 +11,7 @@ import javax.servlet.http.HttpServletResponse; ...@@ -11,7 +11,7 @@ import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
public interface ApiOssService { public interface ApiOssService {
Result<ApiUploadResponse> uploadFile(MultipartFile file, String bucket, String provider, String uploadUser); Result<ApiUploadResponse> uploadFile(MultipartFile file, String bucket, String provider, String uploadUser,String projectBizId);
Result<ApiUploadResponse> uploadFileBody(MultipartFile file, ApiUploadFileRequest request); Result<ApiUploadResponse> uploadFileBody(MultipartFile file, ApiUploadFileRequest request);
......
package com.yd.oss.api.service.impl; package com.yd.oss.api.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils; import com.alibaba.cloud.commons.lang.StringUtils;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiOssService; import com.yd.oss.api.service.ApiOssService;
import com.yd.oss.feign.request.ApiUploadFileRequest; import com.yd.oss.feign.request.ApiUploadFileRequest;
...@@ -42,17 +43,18 @@ public class ApiOssServiceImpl implements ApiOssService { ...@@ -42,17 +43,18 @@ public class ApiOssServiceImpl implements ApiOssService {
* @return * @return
*/ */
@Override @Override
public Result<ApiUploadResponse> uploadFile(MultipartFile file, String bucket, String provider, String uploadUser) { public Result<ApiUploadResponse> uploadFile(MultipartFile file, String bucket, String provider, String uploadUser,String projectBizId) {
if (StringUtils.isBlank(projectBizId)) {
throw new BusinessException("项目ID不能为空");
}
ApiUploadResponse response = new ApiUploadResponse(); ApiUploadResponse response = new ApiUploadResponse();
try { try {
// 如果指定了提供商,则切换 // 切换服务商
if (StringUtils.isNotBlank(provider)) { ossService.switchProviderByProjectId(projectBizId);
ossService.switchProvider(provider);
}
// 上传文件 // 上传文件
OssUploadFileResDto ossUploadFileDto = ossService.uploadFile(file.getInputStream(), file.getOriginalFilename(), OssUploadFileResDto ossUploadFileDto = ossService.uploadFile(file.getInputStream(), file.getOriginalFilename(),
bucket, uploadUser, FileUtil.getFileType(file.getOriginalFilename())); bucket, uploadUser, FileUtil.getFileType(file.getOriginalFilename()),projectBizId);
// 获取上传结果(包含文件信息和访问URL) // 获取上传结果(包含文件信息和访问URL)
UploadResult result = ossService.getUploadResult(ossUploadFileDto.getFileKey(), Duration.ofHours(1)); UploadResult result = ossService.getUploadResult(ossUploadFileDto.getFileKey(), Duration.ofHours(1));
......
...@@ -13,6 +13,7 @@ import com.yd.common.enums.CommonEnum; ...@@ -13,6 +13,7 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator; import com.yd.common.utils.RandomStringGenerator;
import com.yd.oss.api.service.ApiOssStsService; import com.yd.oss.api.service.ApiOssStsService;
import com.yd.oss.service.utils.OssUtils;
import com.yd.oss.feign.dto.ApiOssFileDto; import com.yd.oss.feign.dto.ApiOssFileDto;
import com.yd.oss.feign.request.ApiBatchSaveFilesRequest; import com.yd.oss.feign.request.ApiBatchSaveFilesRequest;
import com.yd.oss.feign.response.ApiBatchSaveFilesResponse; import com.yd.oss.feign.response.ApiBatchSaveFilesResponse;
...@@ -26,7 +27,6 @@ import lombok.extern.slf4j.Slf4j; ...@@ -26,7 +27,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -36,7 +36,6 @@ import java.net.URL; ...@@ -36,7 +36,6 @@ import java.net.URL;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
...@@ -74,6 +73,9 @@ public class ApiOssStsServiceImpl implements ApiOssStsService { ...@@ -74,6 +73,9 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
@Autowired @Autowired
private IOssFileService iOssFileService; private IOssFileService iOssFileService;
@Autowired
private OssUtils ossUtils;
/** /**
* getStsToken如何根据传入的projectBizId查询对应服务商然后切换对应OSS服务商 * getStsToken如何根据传入的projectBizId查询对应服务商然后切换对应OSS服务商
* @param projectBizId * @param projectBizId
...@@ -127,6 +129,9 @@ public class ApiOssStsServiceImpl implements ApiOssStsService { ...@@ -127,6 +129,9 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
tokenResponse.setEndpoint(endpoint); tokenResponse.setEndpoint(endpoint);
tokenResponse.setMaxSize(maxSize); tokenResponse.setMaxSize(maxSize);
//获取分片文件路径的前缀
String filePrefix = ossUtils.getShardFilePrefix(projectBizId,"");
tokenResponse.setFilePrefix(filePrefix);
return Result.success(tokenResponse); return Result.success(tokenResponse);
} catch (ClientException e) { } catch (ClientException e) {
log.error("获取STS凭证失败", e); log.error("获取STS凭证失败", e);
......
...@@ -11,6 +11,7 @@ import org.springframework.http.MediaType; ...@@ -11,6 +11,7 @@ import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotBlank;
import java.util.List; import java.util.List;
/** /**
...@@ -24,8 +25,9 @@ public interface ApiOssFeignClient { ...@@ -24,8 +25,9 @@ public interface ApiOssFeignClient {
* @param file 上传的文件 * @param file 上传的文件
* @return * @return
*/ */
@PostMapping("/upload") @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<ApiUploadResponse> uploadFile(@RequestParam("file") MultipartFile file); Result<ApiUploadResponse> uploadFile(@RequestPart("file") MultipartFile file,
@RequestParam("projectBizId") String projectBizId);
/** /**
* 上传文件 - body入参方式(新,推荐) * 上传文件 - body入参方式(新,推荐)
......
...@@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.GetMapping; ...@@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
/** /**
* OSS-分片服务信息Feign客户端 * OSS-分片服务信息Feign客户端
...@@ -25,7 +24,7 @@ public interface ApiOssStsFeignClient { ...@@ -25,7 +24,7 @@ public interface ApiOssStsFeignClient {
* @return * @return
*/ */
@GetMapping("/sts-token") @GetMapping("/sts-token")
Result<ApiGetStsTokenResponse> getStsToken(@NotBlank(message = "项目ID不能为空") @RequestParam(value = "projectBizId") String projectBizId); Result<ApiGetStsTokenResponse> getStsToken(@RequestParam(value = "projectBizId") String projectBizId);
/** /**
* 批量保存文件列表 * 批量保存文件列表
......
...@@ -23,7 +23,7 @@ public class ApiOssFeignFallbackFactory implements FallbackFactory<ApiOssFeignCl ...@@ -23,7 +23,7 @@ public class ApiOssFeignFallbackFactory implements FallbackFactory<ApiOssFeignCl
public ApiOssFeignClient create(Throwable cause) { public ApiOssFeignClient create(Throwable cause) {
return new ApiOssFeignClient() { return new ApiOssFeignClient() {
@Override @Override
public Result<ApiUploadResponse> uploadFile(MultipartFile file) { public Result<ApiUploadResponse> uploadFile(MultipartFile file,String projectBizId) {
return null; return null;
} }
......
...@@ -23,6 +23,11 @@ public class ApiBatchSaveFilesRequest { ...@@ -23,6 +23,11 @@ public class ApiBatchSaveFilesRequest {
private String projectBizId; private String projectBizId;
/** /**
* 项目类型类型(默认pc)
*/
private String projectType = "pc";
/**
* 对象类型 * 对象类型
*/ */
private String objectType; private String objectType;
......
...@@ -23,4 +23,9 @@ public class ApiOssExportAppointmentExcelRequest { ...@@ -23,4 +23,9 @@ public class ApiOssExportAppointmentExcelRequest {
* 预约信息主表唯一业务ID * 预约信息主表唯一业务ID
*/ */
private String appointmentBizId; private String appointmentBizId;
/**
* 项目ID
*/
private String projectBizId = "project_nKULQBH1Gw9Ma8YM";
} }
...@@ -8,6 +8,11 @@ import javax.validation.constraints.NotBlank; ...@@ -8,6 +8,11 @@ import javax.validation.constraints.NotBlank;
public class ApiUploadFileRequest { public class ApiUploadFileRequest {
/** /**
* 项目ID
*/
private String projectBizId;
/**
* 对象类型 * 对象类型
*/ */
private String objectType; private String objectType;
......
...@@ -18,4 +18,9 @@ public class ApiGetStsTokenResponse { ...@@ -18,4 +18,9 @@ public class ApiGetStsTokenResponse {
private String endpoint; private String endpoint;
private Long maxSize; private Long maxSize;
/**
* 文件前缀
*/
private String filePrefix;
} }
...@@ -15,6 +15,11 @@ import lombok.NoArgsConstructor; ...@@ -15,6 +15,11 @@ import lombok.NoArgsConstructor;
public class OssUploadFileReqDto { public class OssUploadFileReqDto {
/** /**
* 项目ID
*/
private String projectBizId;
/**
* 对象类型 * 对象类型
*/ */
private String objectType; private String objectType;
......
...@@ -16,7 +16,7 @@ import java.time.Duration; ...@@ -16,7 +16,7 @@ import java.time.Duration;
public interface OssService { public interface OssService {
// 上传文件 // 上传文件
OssUploadFileResDto uploadFile(InputStream inputStream, String fileName, String bucketName, String uploadUser, String type); OssUploadFileResDto uploadFile(InputStream inputStream, String fileName, String bucketName, String uploadUser, String type,String projectBizId);
OssUploadFileResDto uploadFileBody(MultipartFile file, OssUploadFileReqDto reqDto); OssUploadFileResDto uploadFileBody(MultipartFile file, OssUploadFileReqDto reqDto);
......
...@@ -24,6 +24,7 @@ import com.yd.oss.service.service.IOssFileService; ...@@ -24,6 +24,7 @@ import com.yd.oss.service.service.IOssFileService;
import com.yd.oss.service.service.IOssProviderService; import com.yd.oss.service.service.IOssProviderService;
import com.yd.oss.service.service.OssService; import com.yd.oss.service.service.OssService;
import com.yd.oss.service.utils.FileUtil; import com.yd.oss.service.utils.FileUtil;
import com.yd.oss.service.utils.OssUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -62,6 +63,9 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -62,6 +63,9 @@ public class AliYunOssServiceImpl implements OssService {
@Autowired @Autowired
private OssProvider currentProvider; // 注入当前提供商 private OssProvider currentProvider; // 注入当前提供商
@Autowired
private OssUtils ossUtils;
/** /**
* 上传文件 * 上传文件
* @param inputStream 文件流 * @param inputStream 文件流
...@@ -73,7 +77,7 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -73,7 +77,7 @@ public class AliYunOssServiceImpl implements OssService {
*/ */
@Override @Override
public OssUploadFileResDto uploadFile(InputStream inputStream, String fileName, public OssUploadFileResDto uploadFile(InputStream inputStream, String fileName,
String bucketName, String uploadUser, String type) { String bucketName, String uploadUser, String type,String projectBizId) {
//获取Security上下文当前用户的登录信息 //获取Security上下文当前用户的登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser(); AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto(); OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
...@@ -89,7 +93,8 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -89,7 +93,8 @@ public class AliYunOssServiceImpl implements OssService {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
// 生成文件key // 生成文件key
String fileKey = FileUtil.generateFileKey(fileName,type); // String fileKey = FileUtil.generateFileKey(fileName,type);
String fileKey = ossUtils.getFilePrefix(projectBizId,"",fileName,type);
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket; String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket;
String fileType = FileUtil.getFileType(fileName); String fileType = FileUtil.getFileType(fileName);
...@@ -181,6 +186,9 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -181,6 +186,9 @@ public class AliYunOssServiceImpl implements OssService {
*/ */
@Override @Override
public OssUploadFileResDto uploadFileBody(MultipartFile file, OssUploadFileReqDto reqDto) { public OssUploadFileResDto uploadFileBody(MultipartFile file, OssUploadFileReqDto reqDto) {
// 切换服务商
switchProviderByProjectId(reqDto.getProjectBizId());
//获取Security上下文当前用户的登录信息 //获取Security上下文当前用户的登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser(); AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto(); OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
...@@ -214,7 +222,8 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -214,7 +222,8 @@ public class AliYunOssServiceImpl implements OssService {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
// 生成文件key // 生成文件key
String fileKey = FileUtil.generateFileKey(fileName,type); // String fileKey = FileUtil.generateFileKey(fileName,type);
String fileKey = ossUtils.getFilePrefix(reqDto.getProjectBizId(),"",fileName,type);
//默认阿里云的桶名 //默认阿里云的桶名
String actualBucket = defaultBucket; String actualBucket = defaultBucket;
//获取文件扩展名 //获取文件扩展名
......
package com.yd.oss.service.service.impl; package com.yd.oss.service.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.common.exception.BusinessException; import com.yd.common.exception.BusinessException;
import com.yd.oss.service.model.OssProvider; import com.yd.oss.service.model.OssProvider;
...@@ -122,6 +123,13 @@ public class OssProviderServiceImpl extends ServiceImpl<OssProviderMapper, OssPr ...@@ -122,6 +123,13 @@ public class OssProviderServiceImpl extends ServiceImpl<OssProviderMapper, OssPr
*/ */
@Override @Override
public OssProvider getProviderByProjectId(String projectBizId) { public OssProvider getProviderByProjectId(String projectBizId) {
if (StringUtils.isBlank(projectBizId)) {
//项目ID空值,查询默认的服务商
return baseMapper.selectOne(new LambdaQueryWrapper<OssProvider>()
.eq(OssProvider::getIsDefault,1)
.last(" limit 1 ")
);
}
return baseMapper.selectOne(new LambdaQueryWrapper<OssProvider>() return baseMapper.selectOne(new LambdaQueryWrapper<OssProvider>()
.eq(OssProvider::getProjectBizId,projectBizId) .eq(OssProvider::getProjectBizId,projectBizId)
.last(" limit 1 ") .last(" limit 1 ")
......
package com.yd.oss.service.utils;
import com.yd.common.result.Result;
import com.yd.user.feign.client.sysproject.ApiSysProjectFeignClient;
import com.yd.user.feign.response.sysproject.ApiSysProjectDetailResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.core.env.Environment;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Component
public class OssUtils {
@Autowired
private Environment environment;
@Autowired
private ApiSysProjectFeignClient apiSysProjectFeignClient;
/**
* 获取通用文件路径的前缀
* @param projectBizId 项目ID
* @param env 环境变量(prod,test)如果不传系统获取
* @param originalFileName 原始文件名
* @param fileType(文件类型,文件扩展名)
* @return
*/
public String getFilePrefix(String projectBizId,String env,
String originalFileName,String fileType) {
String projectType = "pc";
if (StringUtils.isNotBlank(projectBizId)) {
//通过项目ID查询项目类型
Result<ApiSysProjectDetailResponse> result = apiSysProjectFeignClient.detail(projectBizId);
if (result.getData() != null) {
ApiSysProjectDetailResponse response = result.getData();
projectType = StringUtils.isNotBlank(response.getProjectType()) ? response.getProjectType() : "pc";
}
}
if (StringUtils.isBlank(env)) {
env = getActiveEnv();
}
return projectType + "/" + env + "/" + FileUtil.generateFileKey(originalFileName,fileType);
}
/**
* 获取分片文件路径的前缀
* @param projectBizId
* @param env
* @param env
* @return
*/
public String getShardFilePrefix(String projectBizId,String env) {
String projectType = "pc";
if (StringUtils.isNotBlank(projectBizId)) {
//通过项目ID查询项目类型
Result<ApiSysProjectDetailResponse> result = apiSysProjectFeignClient.detail(projectBizId);
if (result.getData() != null) {
ApiSysProjectDetailResponse response = result.getData();
projectType = StringUtils.isNotBlank(response.getProjectType()) ? response.getProjectType() : "pc";
}
}
if (StringUtils.isBlank(env)) {
env = getActiveEnv();
}
return projectType + "/" + env + "/large_file/uploads/" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd/")) + "/";
}
private String getActiveEnv() {
String[] activeProfiles = environment.getActiveProfiles();
return activeProfiles.length > 0 ? activeProfiles[0] : "prod";
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment