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 {
* @return
*/
@Override
public Result<ApiUploadResponse> uploadFile(MultipartFile file) {
return apiOssService.uploadFile(file,"","","");
public Result<ApiUploadResponse> uploadFile(MultipartFile file,String projectBizId) {
return apiOssService.uploadFile(file,"","","",projectBizId);
}
/**
......
......@@ -11,7 +11,7 @@ import javax.servlet.http.HttpServletResponse;
import java.util.List;
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);
......
package com.yd.oss.api.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiOssService;
import com.yd.oss.feign.request.ApiUploadFileRequest;
......@@ -42,17 +43,18 @@ public class ApiOssServiceImpl implements ApiOssService {
* @return
*/
@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();
try {
// 如果指定了提供商,则切换
if (StringUtils.isNotBlank(provider)) {
ossService.switchProvider(provider);
}
// 切换服务商
ossService.switchProviderByProjectId(projectBizId);
// 上传文件
OssUploadFileResDto ossUploadFileDto = ossService.uploadFile(file.getInputStream(), file.getOriginalFilename(),
bucket, uploadUser, FileUtil.getFileType(file.getOriginalFilename()));
bucket, uploadUser, FileUtil.getFileType(file.getOriginalFilename()),projectBizId);
// 获取上传结果(包含文件信息和访问URL)
UploadResult result = ossService.getUploadResult(ossUploadFileDto.getFileKey(), Duration.ofHours(1));
......
......@@ -13,6 +13,7 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
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.request.ApiBatchSaveFilesRequest;
import com.yd.oss.feign.response.ApiBatchSaveFilesResponse;
......@@ -26,7 +27,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -36,7 +36,6 @@ import java.net.URL;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
......@@ -74,6 +73,9 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
@Autowired
private IOssFileService iOssFileService;
@Autowired
private OssUtils ossUtils;
/**
* getStsToken如何根据传入的projectBizId查询对应服务商然后切换对应OSS服务商
* @param projectBizId
......@@ -127,6 +129,9 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
tokenResponse.setEndpoint(endpoint);
tokenResponse.setMaxSize(maxSize);
//获取分片文件路径的前缀
String filePrefix = ossUtils.getShardFilePrefix(projectBizId,"");
tokenResponse.setFilePrefix(filePrefix);
return Result.success(tokenResponse);
} catch (ClientException e) {
log.error("获取STS凭证失败", e);
......
......@@ -11,6 +11,7 @@ import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
......@@ -24,8 +25,9 @@ public interface ApiOssFeignClient {
* @param file 上传的文件
* @return
*/
@PostMapping("/upload")
Result<ApiUploadResponse> uploadFile(@RequestParam("file") MultipartFile file);
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<ApiUploadResponse> uploadFile(@RequestPart("file") MultipartFile file,
@RequestParam("projectBizId") String projectBizId);
/**
* 上传文件 - body入参方式(新,推荐)
......
......@@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
/**
* OSS-分片服务信息Feign客户端
......@@ -25,7 +24,7 @@ public interface ApiOssStsFeignClient {
* @return
*/
@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
public ApiOssFeignClient create(Throwable cause) {
return new ApiOssFeignClient() {
@Override
public Result<ApiUploadResponse> uploadFile(MultipartFile file) {
public Result<ApiUploadResponse> uploadFile(MultipartFile file,String projectBizId) {
return null;
}
......
......@@ -23,6 +23,11 @@ public class ApiBatchSaveFilesRequest {
private String projectBizId;
/**
* 项目类型类型(默认pc)
*/
private String projectType = "pc";
/**
* 对象类型
*/
private String objectType;
......
......@@ -23,4 +23,9 @@ public class ApiOssExportAppointmentExcelRequest {
* 预约信息主表唯一业务ID
*/
private String appointmentBizId;
/**
* 项目ID
*/
private String projectBizId = "project_nKULQBH1Gw9Ma8YM";
}
......@@ -8,6 +8,11 @@ import javax.validation.constraints.NotBlank;
public class ApiUploadFileRequest {
/**
* 项目ID
*/
private String projectBizId;
/**
* 对象类型
*/
private String objectType;
......
......@@ -18,4 +18,9 @@ public class ApiGetStsTokenResponse {
private String endpoint;
private Long maxSize;
/**
* 文件前缀
*/
private String filePrefix;
}
......@@ -15,6 +15,11 @@ import lombok.NoArgsConstructor;
public class OssUploadFileReqDto {
/**
* 项目ID
*/
private String projectBizId;
/**
* 对象类型
*/
private String objectType;
......
......@@ -16,7 +16,7 @@ import java.time.Duration;
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);
......
......@@ -24,6 +24,7 @@ import com.yd.oss.service.service.IOssFileService;
import com.yd.oss.service.service.IOssProviderService;
import com.yd.oss.service.service.OssService;
import com.yd.oss.service.utils.FileUtil;
import com.yd.oss.service.utils.OssUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -62,6 +63,9 @@ public class AliYunOssServiceImpl implements OssService {
@Autowired
private OssProvider currentProvider; // 注入当前提供商
@Autowired
private OssUtils ossUtils;
/**
* 上传文件
* @param inputStream 文件流
......@@ -73,7 +77,7 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public OssUploadFileResDto uploadFile(InputStream inputStream, String fileName,
String bucketName, String uploadUser, String type) {
String bucketName, String uploadUser, String type,String projectBizId) {
//获取Security上下文当前用户的登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
......@@ -89,7 +93,8 @@ public class AliYunOssServiceImpl implements OssService {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
// 生成文件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 fileType = FileUtil.getFileType(fileName);
......@@ -181,6 +186,9 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public OssUploadFileResDto uploadFileBody(MultipartFile file, OssUploadFileReqDto reqDto) {
// 切换服务商
switchProviderByProjectId(reqDto.getProjectBizId());
//获取Security上下文当前用户的登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
......@@ -214,7 +222,8 @@ public class AliYunOssServiceImpl implements OssService {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
// 生成文件key
String fileKey = FileUtil.generateFileKey(fileName,type);
// String fileKey = FileUtil.generateFileKey(fileName,type);
String fileKey = ossUtils.getFilePrefix(reqDto.getProjectBizId(),"",fileName,type);
//默认阿里云的桶名
String actualBucket = defaultBucket;
//获取文件扩展名
......
package com.yd.oss.service.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.common.exception.BusinessException;
import com.yd.oss.service.model.OssProvider;
......@@ -122,6 +123,13 @@ public class OssProviderServiceImpl extends ServiceImpl<OssProviderMapper, OssPr
*/
@Override
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>()
.eq(OssProvider::getProjectBizId,projectBizId)
.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