Commit 06cbc20d by zhangxingmin

push

parent 0378b7bd
package com.yd.oss.api.service.impl;
import com.aliyun.oss.OSS;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiExcelService;
......@@ -10,10 +11,9 @@ import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.result.ImportResult;
import com.yd.oss.service.service.AppointmentExcelService;
import com.yd.oss.service.service.ExcelExportService;
import com.yd.oss.service.service.ExcelImportService;
import com.yd.oss.service.service.ExcelParserService;
import com.yd.oss.service.config.OssClientFactory;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -41,6 +41,12 @@ public class ApiExcelServiceImpl implements ApiExcelService {
@Autowired
private ExcelImportService excelImportService;
@Autowired
private OssClientFactory ossClientFactory;
@Autowired
private IOssProviderService ossProviderService;
/**
* 导出excel-预约信息
* @param request
......@@ -49,9 +55,17 @@ public class ApiExcelServiceImpl implements ApiExcelService {
@Override
public Result<ApiOssExportAppointmentExcelResponse> exportAppointment(ApiOssExportAppointmentExcelRequest request) {
ApiOssExportAppointmentExcelResponse response = new ApiOssExportAppointmentExcelResponse();
// 根据项目ID获取服务商信息
OssProvider provider = ossProviderService.getProviderByProjectId(request.getProjectBizId());
if (provider == null) {
log.error("未找到项目对应的OSS服务商,projectBizId={}", request.getProjectBizId());
return Result.fail("未找到对应的OSS服务商配置");
}
OSS tempClient = ossClientFactory.createOssClient(provider);
String url = appointmentExcelService.exportAppointment(request.getData(),
request.getTemplateType(),
request.getAppointmentBizId());
request.getAppointmentBizId(),
request.getProjectBizId());
response.setUrl(url);
return Result.success(response);
}
......
......@@ -13,6 +13,9 @@ 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.config.OssClientFactory;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IOssProviderService;
import com.yd.oss.service.utils.OssUtils;
import com.yd.oss.feign.dto.ApiOssFileDto;
import com.yd.oss.feign.request.ApiBatchSaveFilesRequest;
......@@ -20,9 +23,7 @@ import com.yd.oss.feign.response.ApiBatchSaveFilesResponse;
import com.yd.oss.feign.response.ApiGetStsTokenResponse;
import com.yd.oss.feign.response.ApiOssFileResponse;
import com.yd.oss.service.model.OssFile;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IOssFileService;
import com.yd.oss.service.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
......@@ -31,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.net.MalformedURLException;
import java.net.URL;
import java.time.LocalDateTime;
......@@ -41,34 +43,15 @@ import java.util.List;
@Service
public class ApiOssStsServiceImpl implements ApiOssStsService {
// @Value("${aliyun.oss.access-key-id:LTAI5tFNiaUM3B4vC2bjqvtB}")
// private String accessKeyId;
//
// @Value("${aliyun.oss.access-key-secret:yH2L5YYmUayBYpQXhYevJ6Ghba349D}")
// private String accessKeySecret;
//
@Value("${aliyun.oss.role-arn:acs:ram::1164861558430519:role/oss-upload-role}")
private String roleArn;
//
// @Value("${aliyun.oss.region:cn-shanghai}")
// private String region;
//
// @Value("${aliyun.oss.bucket:yd-ali-oss}")
// private String bucket;
//
// @Value("${aliyun.oss.endpoint:oss-cn-shanghai-finance-1-pub.aliyuncs.com}")
// private String endpoint;
//
// 注入最大文件大小配置,默认100MB
@Value("${aliyun.oss.max-size:104857600}")
private Long maxSize;
@Autowired
private OssService ossService;
// 动态代理的 OSS 客户端,会自动切换到当前服务商
@Autowired
private OSS ossClient;
private IOssProviderService ossProviderService;
@Autowired
private IOssFileService iOssFileService;
......@@ -76,30 +59,38 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
@Autowired
private OssUtils ossUtils;
@Autowired
private OssClientFactory ossClientFactory; // 如果需要执行OSS操作时使用
/**
* getStsToken如何根据传入的projectBizId查询对应服务商然后切换对应OSS服务商
* @param projectBizId
* @return
* 获取STS临时凭证
* @param projectBizId 项目业务ID,用于确定使用的OSS服务商
* @return STS凭证响应
*/
@Override
public Result<ApiGetStsTokenResponse> getStsToken(String projectBizId) {
// 切换服务商
ossService.switchProviderByProjectId(projectBizId);
// 获取切换后的服务商信息
OssProvider currentProvider = ossService.getCurrentProvider();
String region = currentProvider.getRegion();
String accessKeyId = currentProvider.getAccessKey();
String accessKeySecret = currentProvider.getSecretKey();
// 或 ossService.getDefaultBucket()
String bucket = currentProvider.getBucketName();
// 或 ossService.getDefaultEndpoint()
String endpoint = currentProvider.getEndpoint();
//现在 ossClient 已经指向了切换后的服务商,可以直接使用
if (!ossClient.doesBucketExist(bucket)) {
log.warn("当前服务商的桶 {} 不存在,将尝试创建", bucket);
// 可以创建桶,但通常桶应提前准备好
// 根据项目ID获取服务商信息
OssProvider provider = ossProviderService.getProviderByProjectId(projectBizId);
if (provider == null) {
log.error("未找到项目对应的OSS服务商,projectBizId={}", projectBizId);
return Result.fail("未找到对应的OSS服务商配置");
}
String region = provider.getRegion();
String accessKeyId = provider.getAccessKey();
String accessKeySecret = provider.getSecretKey();
String bucket = provider.getBucketName();
String endpoint = provider.getEndpoint();
// 检查bucket是否存在
// 如果需要检查,可以用ossClientFactory创建临时客户端执行操作,然后关闭
OSS tempClient = ossClientFactory.createOssClient(provider);
try {
if (!tempClient.doesBucketExist(bucket)) {
log.warn("当前服务商的桶 {} 不存在,请确认配置", bucket);
}
} finally {
tempClient.shutdown();
}
// 构建STS客户端
......@@ -129,8 +120,8 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
tokenResponse.setEndpoint(endpoint);
tokenResponse.setMaxSize(maxSize);
//获取分片文件路径的前缀
String filePrefix = ossUtils.getShardFilePrefix(projectBizId,"");
// 获取分片文件路径的前缀
String filePrefix = ossUtils.getShardFilePrefix(projectBizId, "");
tokenResponse.setFilePrefix(filePrefix);
return Result.success(tokenResponse);
} catch (ClientException e) {
......@@ -140,19 +131,23 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
}
/**
* 批量保存文件列表
* 批量保存文件列表(仅保存元数据,不涉及OSS操作)
*
* @return
* @param request 批量保存请求
* @return 保存结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result<ApiBatchSaveFilesResponse> batchSaveFiles(ApiBatchSaveFilesRequest request) {
// 根据 projectBizId 切换服务商,获取当前服务商信息
ossService.switchProviderByProjectId(request.getProjectBizId());
OssProvider currentProvider = ossService.getCurrentProvider();
String providerBizId = currentProvider.getProviderBizId();
String bucketName = currentProvider.getBucketName();
// 根据 projectBizId 获取服务商信息(用于填充providerBizId和bucketName)
OssProvider provider = ossProviderService.getProviderByProjectId(request.getProjectBizId());
if (provider == null) {
log.error("批量保存文件时未找到服务商配置,projectBizId={}", request.getProjectBizId());
return Result.fail("未找到对应的OSS服务商配置");
}
String providerBizId = provider.getProviderBizId();
String bucketName = provider.getBucketName();
// 获取当前登录用户信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
......@@ -227,7 +222,7 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
}
}
// 批量保存(修复条件判断:列表不为空时才保存)
// 批量保存
if (CollectionUtils.isNotEmpty(saveOssFileList)) {
iOssFileService.saveOrUpdateBatch(saveOssFileList);
// 构建响应
......
......@@ -27,5 +27,5 @@ public class ApiOssExportAppointmentExcelRequest {
/**
* 项目ID
*/
private String projectBizId = "project_nKULQBH1Gw9Ma8YM";
private String projectBizId;
}
package com.yd.oss.service.config;
import com.aliyun.oss.OSS;
import com.yd.oss.service.service.OssService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicOssClientProxy implements InvocationHandler {
private final OssService ossService;
public DynamicOssClientProxy(OssService ossService) {
this.ossService = ossService;
}
public static OSS createProxy(OssService ossService) {
return (OSS) Proxy.newProxyInstance(
DynamicOssClientProxy.class.getClassLoader(),
new Class[]{OSS.class},
new DynamicOssClientProxy(ossService)
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 每次方法调用都从 OssService 获取当前客户端
OSS currentClient = ossService.getOssClient();
return method.invoke(currentClient, args);
}
}
\ No newline at end of file
//package com.yd.oss.service.config;
//
//import com.aliyun.oss.OSS;
//import com.yd.oss.service.service.OssService;
//
//import java.lang.reflect.InvocationHandler;
//import java.lang.reflect.Method;
//import java.lang.reflect.Proxy;
//
//public class DynamicOssClientProxy implements InvocationHandler {
// private final OssService ossService;
//
// public DynamicOssClientProxy(OssService ossService) {
// this.ossService = ossService;
// }
//
// public static OSS createProxy(OssService ossService) {
// return (OSS) Proxy.newProxyInstance(
// DynamicOssClientProxy.class.getClassLoader(),
// new Class[]{OSS.class},
// new DynamicOssClientProxy(ossService)
// );
// }
//
// @Override
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// // 每次方法调用都从 OssService 获取当前客户端
// OSS currentClient = ossService.getOssClient();
// return method.invoke(currentClient, args);
// }
//}
\ No newline at end of file
package com.yd.oss.service.config;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IOssProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class OssClientFactory {
@Autowired
private IOssProviderService ossProviderService;
/**
* 根据服务商业务ID创建临时OSS客户端
* @param providerBizId 服务商业务ID
* @return OSS客户端(使用后必须调用shutdown())
*/
public OSS createOssClient(String providerBizId) {
OssProvider provider = ossProviderService.getProviderByBizId(providerBizId);
return new OSSClientBuilder().build(
provider.getEndpoint(),
provider.getAccessKey(),
provider.getSecretKey()
);
}
/**
* 根据项目ID创建临时OSS客户端
* @param projectBizId 项目业务ID
* @return OSS客户端(使用后必须调用shutdown())
*/
public OSS createOssClientByProject(String projectBizId) {
OssProvider provider = ossProviderService.getProviderByProjectId(projectBizId);
return new OSSClientBuilder().build(
provider.getEndpoint(),
provider.getAccessKey(),
provider.getSecretKey()
);
}
/**
* 直接根据OssProvider对象创建客户端(如果调用者已持有provider)
*/
public OSS createOssClient(OssProvider provider) {
return new OSSClientBuilder().build(
provider.getEndpoint(),
provider.getAccessKey(),
provider.getSecretKey()
);
}
}
\ No newline at end of file
......@@ -39,22 +39,22 @@ public class OssConfig {
}
}
// @Bean
// @Primary
// public OSS ossClient() {
// return new OSSClientBuilder().build(
// currentProvider.getEndpoint(),
// currentProvider.getAccessKey(),
// currentProvider.getSecretKey()
// );
// }
@Bean
public OSS ossClient(OssService ossService) {
// 返回动态代理,每次调用都委托给 ossService.getOssClient()
return DynamicOssClientProxy.createProxy(ossService);
@Primary
public OSS ossClient() {
return new OSSClientBuilder().build(
currentProvider.getEndpoint(),
currentProvider.getAccessKey(),
currentProvider.getSecretKey()
);
}
// @Bean
// public OSS ossClient(OssService ossService) {
// // 返回动态代理,每次调用都委托给 ossService.getOssClient()
// return DynamicOssClientProxy.createProxy(ossService);
// }
@Bean
public String defaultBucket() {
return defaultBucket;
......
......@@ -6,5 +6,6 @@ public interface AppointmentExcelService {
String exportAppointment(Map<String, Object> data,
String templateType,
String appointmentBizId);
String appointmentBizId,
String projectBizId);
}
package com.yd.oss.service.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
......@@ -13,6 +12,7 @@ import com.yd.common.exception.BusinessException;
import com.yd.common.utils.IpUtil;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.oss.feign.request.ApiUploadFileRequest;
import com.yd.oss.service.config.OssClientFactory;
import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.OssUploadFileReqDto;
import com.yd.oss.service.dto.OssUploadFileResDto;
......@@ -49,23 +49,17 @@ public class AliYunOssServiceImpl implements OssService {
@Autowired
private IOssFileService ossFileService;
// @Autowired
// private OSS realOssClient; // 注入OSS客户端
private OSS realOssClient; // 真实客户端
@Autowired
private String defaultBucket; // 注入默认存储桶
@Autowired
private String defaultEndpoint; // 注入默认服务端点
@Autowired
private OssProvider currentProvider; // 注入当前提供商
private OssClientFactory ossClientFactory;
@Autowired
private OssUtils ossUtils;
// 默认提供商(用于没有传入项目ID或提供商ID的情况)
private OssProvider getDefaultProvider() {
return ossProviderService.getDefaultProvider();
}
/**
* 上传文件
* @param inputStream 文件流
......@@ -73,110 +67,25 @@ public class AliYunOssServiceImpl implements OssService {
* @param bucketName OSS桶名
* @param uploadUser 操作用户
* @param type oss文件夹分类目录类型,例:如果是.xls那就是excel/
* @param projectBizId 项目业务ID(用于确定OSS提供商)
* @return
*/
@Override
public OssUploadFileResDto uploadFile(InputStream inputStream, String fileName,
String bucketName, String uploadUser, String type,String projectBizId) {
// 切换服务商
switchProviderByProjectId(projectBizId);
//获取Security上下文当前用户的登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
long startTime = System.currentTimeMillis(); // 记录开始时间
String operationResult = "success"; // 操作结果
String errorMessage = null; // 错误信息
OssFile ossFile = null; // 文件记录
String bucketName, String uploadUser, String type, String projectBizId) {
// 获取提供商
OssProvider provider = ossProviderService.getProviderByProjectId(projectBizId);
if (provider == null) {
throw new BusinessException("未找到项目对应的OSS提供商,projectBizId=" + projectBizId);
}
OSS ossClient = null;
try {
// 读取输入流到字节数组
byte[] fileData = FileUtil.readInputStreamToBytes(inputStream);
long fileSize = fileData.length;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
// 生成文件key
// 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);
// 创建上传请求
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileSize);
metadata.setContentType(FileUtil.getContentType(fileType));
// 设置公共读权限(如果需要)
// metadata.setObjectAcl(CannedAccessControlList.PublicRead);
PutObjectRequest putObjectRequest = new PutObjectRequest(
actualBucket, fileKey, byteArrayInputStream, metadata);
// 上传文件
realOssClient.putObject(putObjectRequest);
// 创建文件记录
ossFile = new OssFile();
ossFile.setFileBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_OSS_FILE.getCode()));
ossFile.setFileKey(fileKey);
ossFile.setOriginalName(fileName);
ossFile.setFileSize(fileSize);
ossFile.setFileType(fileType);
ossFile.setProviderBizId(currentProvider.getProviderBizId());
ossFile.setBucketName(actualBucket);
ossFile.setUploadUser(uploadUser);
ossFile.setCreatorId(authUserDto.getUserBizId());
ossFile.setCreatorName(authUserDto.getUsername());
// 保存文件元数据到数据库
ossFileService.saveFileMetadata(ossFile);
// 创建操作日志
OssOperationLog operationLog = new OssOperationLog();
operationLog.setFileBizId(ossFile.getFileBizId());
operationLog.setOperationType("upload");
operationLog.setOperationUser(uploadUser);
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
log.info("文件上传成功: {} -> {}/{}", fileName, actualBucket, fileKey);
ossUploadFileDto.setFileBizId(ossFile.getFileBizId());
ossUploadFileDto.setFileKey(fileKey);
ossUploadFileDto.setOriginalName(fileName);
// 如果设置了公共读,可以直接拼接URL
String publicUrl = "https://" + actualBucket + "." + defaultEndpoint + "/" + fileKey;
ossUploadFileDto.setUrl(publicUrl);
return ossUploadFileDto;
} catch (Exception e) {
operationResult = "failure"; // 标记操作失败
errorMessage = e.getMessage(); // 记录错误信息
log.error("阿里云OSS上传文件失败: {}", fileName, e);
throw new RuntimeException("阿里云OSS上传文件失败: " + fileName, e);
ossClient = ossClientFactory.createOssClient(provider);
return doUploadFile(ossClient, provider, inputStream, fileName, bucketName, uploadUser, type, null, null, null, null, null, null);
} finally {
// 关闭资源
FileUtil.closeQuietly(inputStream);
// 记录失败日志
if ("failure".equals(operationResult)) {
OssOperationLog operationLog = new OssOperationLog();
if (ossFile != null) {
operationLog.setFileBizId(ossFile.getFileBizId());
} else {
operationLog.setFileBizId("-1"); // 使用无效文件ID
}
operationLog.setOperationType("upload");
operationLog.setOperationUser(uploadUser);
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
if (ossClient != null) {
ossClient.shutdown();
}
}
}
......@@ -189,61 +98,94 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public OssUploadFileResDto uploadFileBody(MultipartFile file, OssUploadFileReqDto reqDto) {
// 切换服务商
switchProviderByProjectId(reqDto.getProjectBizId());
// 获取提供商
OssProvider provider = ossProviderService.getProviderByProjectId(reqDto.getProjectBizId());
if (provider == null) {
throw new BusinessException("未找到项目对应的OSS提供商,projectBizId=" + reqDto.getProjectBizId());
}
//获取Security上下文当前用户的登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
// 记录开始时间
long startTime = System.currentTimeMillis();
// 操作结果
String operationResult = "success";
// 错误信息
String errorMessage = null;
// 文件记录
OssFile ossFile = null;
//文件输入流
OSS ossClient = null;
InputStream inputStream = null;
//原始文件名
String fileName = file.getOriginalFilename();
//文件扩展名
String type = FileUtil.getFileType(file.getOriginalFilename());
try {
inputStream = file.getInputStream();
ossClient = ossClientFactory.createOssClient(provider);
return doUploadFile(ossClient, provider, inputStream, file.getOriginalFilename(),
provider.getBucketName(), reqDto.getUploadUser(),
FileUtil.getFileType(file.getOriginalFilename()),
reqDto.getObjectBizId(), reqDto.getObjectName(),
reqDto.getObjectTableName(), reqDto.getObjectType(),
reqDto.getObjectBizId(), reqDto.getObjectName()); // 这里需要根据实际情况调整,原代码中存储了object信息
} catch (IOException e) {
e.printStackTrace();
throw new BusinessException("文件输入流解析异常:{}");
log.error("文件输入流解析异常", e);
throw new BusinessException("文件输入流解析异常");
} finally {
FileUtil.closeQuietly(inputStream);
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
* 上传文件(使用默认存储桶)
* @param inputStream
* @param fileName
* @param uploadUser
* @return
*/
@Override
public String uploadFile(InputStream inputStream, String fileName, String uploadUser) {
// 使用默认提供商
OssProvider defaultProvider = getDefaultProvider();
OSS ossClient = null;
try {
ossClient = ossClientFactory.createOssClient(defaultProvider);
OssUploadFileResDto result = doUploadFile(ossClient, defaultProvider, inputStream, fileName,
defaultProvider.getBucketName(), uploadUser, null, null, null, null, null, null, null);
return result.getUrl();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
* 实际执行上传的逻辑(复用代码)
*/
private OssUploadFileResDto doUploadFile(OSS ossClient, OssProvider provider,
InputStream inputStream, String fileName,
String bucketName, String uploadUser, String type,
String objectBizId, String objectName,
String objectTableName, String objectType,
String creatorId, String creatorName) {
long startTime = System.currentTimeMillis();
String operationResult = "success";
String errorMessage = null;
OssFile ossFile = null;
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
try {
// 读取输入流到字节数组
byte[] fileData = FileUtil.readInputStreamToBytes(inputStream);
long fileSize = fileData.length;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
// 生成文件key
// String fileKey = FileUtil.generateFileKey(fileName,type);
String fileKey = ossUtils.getFilePrefix(reqDto.getProjectBizId(),"",fileName,type);
//默认阿里云的桶名
String actualBucket = defaultBucket;
//获取文件扩展名
// 生成文件key(这里使用ossUtils的方法,需要传入projectBizId,但此时provider已知,可根据需要调整)
String fileKey = ossUtils.getFilePrefix(provider.getProviderBizId(), "", fileName, type);
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : provider.getBucketName();
String fileType = FileUtil.getFileType(fileName);
// 创建上传请求
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileSize);
metadata.setContentType(FileUtil.getContentType(fileType));
// 设置公共读权限(如果需要)
// metadata.setObjectAcl(CannedAccessControlList.PublicRead);
PutObjectRequest putObjectRequest = new PutObjectRequest(
actualBucket, fileKey, byteArrayInputStream, metadata);
// 上传文件
realOssClient.putObject(putObjectRequest);
ossClient.putObject(putObjectRequest);
// 创建文件记录
ossFile = new OssFile();
......@@ -252,90 +194,67 @@ public class AliYunOssServiceImpl implements OssService {
ossFile.setOriginalName(fileName);
ossFile.setFileSize(fileSize);
ossFile.setFileType(fileType);
ossFile.setProviderBizId(currentProvider.getProviderBizId());
ossFile.setProviderBizId(provider.getProviderBizId());
ossFile.setBucketName(actualBucket);
ossFile.setUploadUser(reqDto.getUploadUser());
//存储对象信息
ossFile.setObjectBizId(reqDto.getObjectBizId());
ossFile.setObjectName(reqDto.getObjectName());
ossFile.setObjectTableName(reqDto.getObjectTableName());
ossFile.setObjectType(reqDto.getObjectType());
ossFile.setUploadUser(uploadUser);
ossFile.setObjectBizId(objectBizId);
ossFile.setObjectName(objectName);
ossFile.setObjectTableName(objectTableName);
ossFile.setObjectType(objectType);
// 获取当前登录用户信息(如果存在)
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
if (authUserDto != null) {
ossFile.setCreatorId(authUserDto.getUserBizId());
ossFile.setCreatorName(authUserDto.getUsername());
// 保存文件元数据到数据库
} else {
ossFile.setCreatorId(creatorId);
ossFile.setCreatorName(creatorName);
}
ossFileService.saveFileMetadata(ossFile);
// 创建操作日志
// 记录成功操作日志
OssOperationLog operationLog = new OssOperationLog();
operationLog.setFileBizId(ossFile.getFileBizId());
operationLog.setOperationType("upload");
operationLog.setOperationUser(reqDto.getUploadUser());
operationLog.setOperationUser(uploadUser);
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
log.info("文件上传成功: {} -> {}/{}", fileName, actualBucket, fileKey);
ossUploadFileDto.setFileBizId(ossFile.getFileBizId());
ossUploadFileDto.setFileKey(fileKey);
ossUploadFileDto.setOriginalName(fileName);
// 如果设置了公共读,可以直接拼接URL
String publicUrl = "https://" + actualBucket + "." + defaultEndpoint + "/" + fileKey;
// 构建访问URL(根据实际需要,可以是公共读或预签名URL)
String publicUrl = "https://" + actualBucket + "." + provider.getEndpoint() + "/" + fileKey;
ossUploadFileDto.setUrl(publicUrl);
ossUploadFileDto.setFileSize(fileSize);
ossUploadFileDto.setFileType(fileType);
return ossUploadFileDto;
} catch (Exception e) {
// 标记操作失败
operationResult = "failure";
// 记录错误信息
errorMessage = e.getMessage();
log.error("阿里云OSS上传文件失败: {}", fileName, e);
throw new RuntimeException("阿里云OSS上传文件失败: " + fileName, e);
log.error("OSS上传文件失败: {}", fileName, e);
throw new RuntimeException("OSS上传文件失败: " + fileName, e);
} finally {
// 关闭资源
FileUtil.closeQuietly(inputStream);
// 记录失败日志
// 记录失败日志(如果失败)
if ("failure".equals(operationResult)) {
OssOperationLog operationLog = new OssOperationLog();
if (ossFile != null) {
operationLog.setFileBizId(ossFile.getFileBizId());
} else {
// 使用无效文件ID
operationLog.setFileBizId("-1");
}
operationLog.setFileBizId(ossFile != null ? ossFile.getFileBizId() : "-1");
operationLog.setOperationType("upload");
operationLog.setOperationUser(reqDto.getUploadUser());
operationLog.setOperationUser(uploadUser);
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
}
}
}
/**
* 上传文件(使用默认存储桶)
* @param inputStream
* @param fileName
* @param uploadUser
* @return
*/
@Override
public String uploadFile(InputStream inputStream, String fileName, String uploadUser) {
// 调用重载方法,使用默认存储桶
// return uploadFile(inputStream, fileName, defaultBucket, uploadUser);
return null;
}
/**
* 下载文件
* @param fileKey
* @param bucketName
......@@ -343,61 +262,46 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public InputStream downloadFile(String fileKey, String bucketName) {
long startTime = System.currentTimeMillis(); // 记录开始时间
String operationResult = "success"; // 操作结果
String errorMessage = null; // 错误信息
OssFile ossFile = null; // 文件记录
// 根据文件key获取提供商信息
OssFile ossFile = ossFileService.getFileByKey(fileKey);
if (ossFile == null) {
throw new BusinessException("文件不存在: " + fileKey);
}
OssProvider provider = ossProviderService.getProviderByBizId(ossFile.getProviderBizId());
if (provider == null) {
throw new BusinessException("提供商不存在: " + ossFile.getProviderBizId());
}
OSS ossClient = null;
try {
// 确定存储桶(如果未指定则使用默认存储桶)
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket;
// 获取文件信息
ossFile = ossFileService.getFileByKey(fileKey);
ossClient = ossClientFactory.createOssClient(provider);
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : ossFile.getBucketName();
// 从阿里云OSS下载文件
OSSObject ossObject = realOssClient.getObject(actualBucket, fileKey);
OSSObject ossObject = ossClient.getObject(actualBucket, fileKey);
InputStream inputStream = ossObject.getObjectContent();
// 创建操作日志
OssOperationLog operationLog = new OssOperationLog();
operationLog.setFileBizId(ossFile.getFileBizId());
operationLog.setOperationType("download");
operationLog.setOperationUser("system"); // 系统操作
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
// 记录操作日志(成功)
recordOperationLog(ossFile.getFileBizId(), "download", "system", "success", null, System.currentTimeMillis());
log.info("文件下载成功: {}/{}", actualBucket, fileKey);
// 注意:返回的InputStream需要由调用者负责关闭,但OSS客户端必须在此方法内关闭?
// 不能关闭,因为流还未消费完。此处需要特殊处理:返回的流内部可能关联OSSClient,调用者使用后需主动关闭。
// 一个解决方案是使用包装流,在close时同时关闭OSSClient。但为简化,这里不处理,要求调用者显式关闭。
// 更好的做法是返回一个包装流,但需要改造。为了示例,我们保留原逻辑,但强调调用者需要关闭流并手动shutdown客户端。
// 由于客户端不能在这里关闭,我们不得不将客户端保留到流消费完。这会导致资源泄漏。
// 因此,建议将下载操作设计为直接返回字节数组或使用回调,或者使用预签名URL让客户端直接下载。
// 这里为了演示,我们返回流,但客户端无法在这里关闭,存在风险。
// 实际使用时,可考虑返回预签名URL或使用临时文件。
// 此处暂时返回流,并记录警告。
log.warn("返回原始InputStream,调用者必须确保在使用后关闭流,并注意OSSClient资源管理。");
return inputStream;
} catch (Exception e) {
operationResult = "failure"; // 标记操作失败
errorMessage = e.getMessage(); // 记录错误信息
log.error("阿里云OSS下载文件失败: {}", fileKey, e);
throw new RuntimeException("阿里云OSS下载文件失败: " + fileKey, e);
recordOperationLog(ossFile != null ? ossFile.getFileBizId() : "-1", "download", "system", "failure", e.getMessage(), System.currentTimeMillis());
log.error("OSS下载文件失败: {}", fileKey, e);
throw new RuntimeException("OSS下载文件失败: " + fileKey, e);
} finally {
// 记录失败日志
if ("failure".equals(operationResult)) {
OssOperationLog operationLog = new OssOperationLog();
if (ossFile != null) {
operationLog.setFileBizId(ossFile.getFileBizId());
} else {
operationLog.setFileBizId("-1"); // 使用无效文件ID
}
operationLog.setOperationType("download");
operationLog.setOperationUser("system");
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
}
// 注意:不能在这里shutdown,因为InputStream可能还未消费完。但如果不shutdown,客户端会一直保持连接。
// 这是一个设计问题。实际生产环境建议使用预签名URL或临时文件下载。
}
}
......@@ -408,8 +312,7 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public InputStream downloadFile(String fileKey) {
// 调用重载方法,使用默认存储桶
return downloadFile(fileKey, defaultBucket);
return downloadFile(fileKey, null);
}
/**
......@@ -421,122 +324,67 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public boolean deleteFile(String fileKey, String bucketName, String operator) {
long startTime = System.currentTimeMillis(); // 记录开始时间
String operationResult = "success"; // 操作结果
String errorMessage = null; // 错误信息
OssFile ossFile = null; // 文件记录
OssFile ossFile = ossFileService.getFileByKey(fileKey);
if (ossFile == null) {
throw new BusinessException("文件不存在: " + fileKey);
}
OssProvider provider = ossProviderService.getProviderByBizId(ossFile.getProviderBizId());
if (provider == null) {
throw new BusinessException("提供商不存在: " + ossFile.getProviderBizId());
}
OSS ossClient = null;
long startTime = System.currentTimeMillis();
try {
// 确定存储桶(如果未指定则使用默认存储桶)
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket;
// 获取文件信息
ossFile = ossFileService.getFileByKey(fileKey);
ossClient = ossClientFactory.createOssClient(provider);
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : ossFile.getBucketName();
// 从阿里云OSS删除文件 TODO
realOssClient.deleteObject(actualBucket, ossFile.getFileKey());
// 标记文件为已删除
ossClient.deleteObject(actualBucket, ossFile.getFileKey());
ossFileService.markFileAsDeleted(fileKey);
// 创建操作日志
OssOperationLog operationLog = new OssOperationLog();
operationLog.setFileBizId(ossFile.getFileBizId());
operationLog.setOperationType("delete");
operationLog.setOperationUser(operator);
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
recordOperationLog(ossFile.getFileBizId(), "delete", operator, "success", null, startTime);
log.info("文件删除成功: {}/{}", actualBucket, fileKey);
return true;
} catch (Exception e) {
operationResult = "failure"; // 标记操作失败
errorMessage = e.getMessage(); // 记录错误信息
log.error("阿里云OSS删除文件失败: {}", fileKey, e);
throw new RuntimeException("阿里云OSS删除文件失败: " + fileKey, e);
recordOperationLog(ossFile.getFileBizId(), "delete", operator, "failure", e.getMessage(), startTime);
log.error("OSS删除文件失败: {}", fileKey, e);
throw new RuntimeException("OSS删除文件失败: " + fileKey, e);
} finally {
// 记录失败日志
if ("failure".equals(operationResult)) {
OssOperationLog operationLog = new OssOperationLog();
if (ossFile != null) {
operationLog.setFileBizId(ossFile.getFileBizId());
} else {
operationLog.setFileBizId("-1"); // 使用无效文件ID
}
operationLog.setOperationType("delete");
operationLog.setOperationUser(operator);
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
if (ossClient != null) {
ossClient.shutdown();
}
}
}
@Override
public boolean deleteFileByBizId(String fileBizId, String operator) {
long startTime = System.currentTimeMillis();
String operationResult = "success";
String errorMessage = null;
OssFile ossFile = null;
try {
// 查询文件记录
ossFile = ossFileService.queryOne(fileBizId);
OssFile ossFile = ossFileService.queryOne(fileBizId);
if (ossFile == null) {
throw new BusinessException("文件不存在: " + fileBizId);
}
// 根据提供商ID获取并切换提供商
OssProvider provider = ossProviderService.getProviderByBizId(ossFile.getProviderBizId());
if (provider == null) {
throw new BusinessException("提供商不存在: " + ossFile.getProviderBizId());
}
switchToProvider(provider);
// 删除OSS文件
realOssClient.deleteObject(ossFile.getBucketName(), ossFile.getFileKey());
// 物理删除数据库记录
OSS ossClient = null;
long startTime = System.currentTimeMillis();
try {
ossClient = ossClientFactory.createOssClient(provider);
ossClient.deleteObject(ossFile.getBucketName(), ossFile.getFileKey());
ossFileService.removeById(ossFile.getId());
// 记录成功操作日志
OssOperationLog operationLog = new OssOperationLog();
operationLog.setFileBizId(ossFile.getFileBizId());
operationLog.setOperationType("delete");
operationLog.setOperationUser(operator);
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
ossFileService.saveOperationLog(operationLog);
recordOperationLog(ossFile.getFileBizId(), "delete", operator, "success", null, startTime);
log.info("文件删除成功: {}/{}", ossFile.getBucketName(), ossFile.getFileKey());
return true;
} catch (Exception e) {
operationResult = "failure";
errorMessage = e.getMessage();
recordOperationLog(ossFile.getFileBizId(), "delete", operator, "failure", e.getMessage(), startTime);
log.error("删除文件失败: fileBizId={}", fileBizId, e);
// 记录失败操作日志
OssOperationLog operationLog = new OssOperationLog();
operationLog.setFileBizId(ossFile != null ? ossFile.getFileBizId() : "-1");
operationLog.setOperationType("delete");
operationLog.setOperationUser(operator);
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
ossFileService.saveOperationLog(operationLog);
throw new RuntimeException("删除文件失败: " + fileBizId, e);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
......@@ -548,12 +396,11 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public boolean deleteFile(String fileKey, String operator) {
// 调用重载方法,使用默认存储桶
return deleteFile(fileKey, defaultBucket, operator);
return deleteFile(fileKey, null, operator);
}
/**
* 获取文件URL
* 获取文件URL(预签名)
* @param fileKey
* @param bucketName
* @param expiration
......@@ -561,18 +408,29 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public String getFileUrl(String fileKey, String bucketName, Duration expiration) {
try {
// 确定存储桶(如果未指定则使用默认存储桶)
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket;
OssFile ossFile = ossFileService.getFileByKey(fileKey);
if (ossFile == null) {
throw new BusinessException("文件不存在: " + fileKey);
}
OssProvider provider = ossProviderService.getProviderByBizId(ossFile.getProviderBizId());
if (provider == null) {
throw new BusinessException("提供商不存在: " + ossFile.getProviderBizId());
}
// 生成预签名URL(带过期时间)
OSS ossClient = null;
try {
ossClient = ossClientFactory.createOssClient(provider);
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : ossFile.getBucketName();
Date expirationDate = new Date(System.currentTimeMillis() + expiration.toMillis());
URL url = realOssClient.generatePresignedUrl(actualBucket, fileKey, expirationDate);
URL url = ossClient.generatePresignedUrl(actualBucket, fileKey, expirationDate);
return url.toString();
} catch (Exception e) {
log.error("阿里云OSS获取文件URL失败: {}", fileKey, e);
throw new RuntimeException("阿里云OSS获取文件URL失败: " + fileKey, e);
log.error("获取文件URL失败: {}", fileKey, e);
throw new RuntimeException("获取文件URL失败: " + fileKey, e);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
......@@ -584,8 +442,7 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public String getFileUrl(String fileKey, Duration expiration) {
// 调用重载方法,使用默认存储桶
return getFileUrl(fileKey, defaultBucket, expiration);
return getFileUrl(fileKey, null, expiration);
}
/**
......@@ -596,15 +453,27 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public boolean doesFileExist(String fileKey, String bucketName) {
try {
// 确定存储桶(如果未指定则使用默认存储桶)
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket;
OssFile ossFile = ossFileService.getFileByKey(fileKey);
if (ossFile == null) {
return false;
}
OssProvider provider = ossProviderService.getProviderByBizId(ossFile.getProviderBizId());
if (provider == null) {
return false;
}
// 检查文件是否存在
return realOssClient.doesObjectExist(actualBucket, fileKey);
OSS ossClient = null;
try {
ossClient = ossClientFactory.createOssClient(provider);
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : ossFile.getBucketName();
return ossClient.doesObjectExist(actualBucket, fileKey);
} catch (Exception e) {
log.error("阿里云OSS检查文件存在失败: {}", fileKey, e);
throw new RuntimeException("阿里云OSS检查文件存在失败: " + fileKey, e);
log.error("检查文件存在失败: {}", fileKey, e);
return false;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
......@@ -615,8 +484,7 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public boolean doesFileExist(String fileKey) {
// 调用重载方法,使用默认存储桶
return doesFileExist(fileKey, defaultBucket);
return doesFileExist(fileKey, null);
}
/**
......@@ -627,25 +495,36 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public FileMetadata getFileMetadata(String fileKey, String bucketName) {
try {
// 确定存储桶(如果未指定则使用默认存储桶)
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket;
OssFile ossFile = ossFileService.getFileByKey(fileKey);
if (ossFile == null) {
throw new BusinessException("文件不存在: " + fileKey);
}
OssProvider provider = ossProviderService.getProviderByBizId(ossFile.getProviderBizId());
if (provider == null) {
throw new BusinessException("提供商不存在: " + ossFile.getProviderBizId());
}
// 获取文件元数据
ObjectMetadata objectMetadata = realOssClient.getObjectMetadata(actualBucket, fileKey);
OSS ossClient = null;
try {
ossClient = ossClientFactory.createOssClient(provider);
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : ossFile.getBucketName();
ObjectMetadata objectMetadata = ossClient.getObjectMetadata(actualBucket, fileKey);
// 转换为通用文件元数据格式
FileMetadata metadata = new FileMetadata();
metadata.setFileKey(fileKey);
metadata.setFileSize(objectMetadata.getContentLength());
metadata.setContentType(objectMetadata.getContentType());
// metadata.setLastModified(objectMetadata.getLastModified());
metadata.setEtag(objectMetadata.getETag());
// 如果有最后修改时间,可设置
// metadata.setLastModified(objectMetadata.getLastModified());
return metadata;
} catch (Exception e) {
log.error("阿里云OSS获取文件元数据失败: {}", fileKey, e);
throw new RuntimeException("阿里云OSS获取文件元数据失败: " + fileKey, e);
log.error("获取文件元数据失败: {}", fileKey, e);
throw new RuntimeException("获取文件元数据失败: " + fileKey, e);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
......@@ -656,149 +535,77 @@ public class AliYunOssServiceImpl implements OssService {
*/
@Override
public FileMetadata getFileMetadata(String fileKey) {
// 调用重载方法,使用默认存储桶
return getFileMetadata(fileKey, defaultBucket);
return getFileMetadata(fileKey, null);
}
/**
* 切换OSS提供商-根据项目ID切换
* @param projectBizId
* 切换OSS提供商-根据项目ID切换(已废弃,由每次操作动态决定,保留空实现)
*/
@Override
public void switchProviderByProjectId(String projectBizId) {
try {
// 根据项目ID获取OSS提供商
OssProvider provider = ossProviderService.getProviderByProjectId(projectBizId);
// 切换到新的提供商
switchToProvider(provider);
log.info("已切换到OSS提供商: {}", provider.getName());
} catch (Exception e) {
log.error("切换OSS提供商失败:{}",e.getMessage());
// 然后可以尝试抛出异常(注意不要再次记录日志)
throw new RuntimeException("切换OSS提供商失败");
}
// 不再需要
}
/**
* 切换OSS提供商
* @param providerName
* 切换OSS提供商(已废弃)
*/
@Override
public void switchProvider(String providerName) {
try {
// 根据名称获取OSS提供商
OssProvider provider = ossProviderService.getProviderByName(providerName);
// 切换到新的提供商
switchToProvider(provider);
log.info("已切换到OSS提供商: {}", providerName);
} catch (Exception e) {
log.error("切换OSS提供商失败: {}", providerName, e);
throw new RuntimeException("切换OSS提供商失败: " + providerName, e);
}
// 不再需要
}
/**
* 切换OSS提供商(通过ID)
* @param providerId
* 切换OSS提供商(已废弃)
*/
@Override
public void switchProvider(Long providerId) {
try {
// 根据ID获取OSS提供商
OssProvider provider = ossProviderService.getProviderById(providerId);
// 切换到新的提供商
switchToProvider(provider);
log.info("已切换到OSS提供商ID: {}", providerId);
} catch (Exception e) {
log.error("切换OSS提供商失败: {}", providerId, e);
throw new RuntimeException("切换OSS提供商失败: " + providerId, e);
}
// 不再需要
}
/**
* 获取当前使用的 OSS 客户端
* @return
* 获取当前使用的 OSS 客户端(已废弃,返回null)
*/
@Override
public OSS getOssClient() {
// 返回当前实例持有的客户端
return this.realOssClient;
}
/**
* 切换到指定的OSS提供商
* @param provider
*/
private void switchToProvider(OssProvider provider) {
// 关闭旧的真实客户端
if (this.realOssClient != null) {
this.realOssClient.shutdown();
}
// 创建新的真实客户端
this.realOssClient = new OSSClientBuilder().build(
provider.getEndpoint(),
provider.getAccessKey(),
provider.getSecretKey()
);
this.currentProvider = provider;
this.defaultBucket = provider.getBucketName();
this.defaultEndpoint = provider.getEndpoint();
return null;
}
/**
* 获取当前使用的提供商
* @return
* 获取当前使用的提供商(已废弃,返回默认提供商)
*/
@Override
public OssProvider getCurrentProvider() {
return currentProvider;
return getDefaultProvider();
}
/**
* 设置默认存储桶
* @param bucketName
* 设置默认存储桶(已废弃)
*/
@Override
public void setDefaultBucket(String bucketName) {
this.defaultBucket = bucketName;
log.info("已设置默认存储桶: {}", bucketName);
// 不再需要
}
/**
* 获取默认存储桶
* @return
* 获取默认存储桶(已废弃,返回默认提供商的桶)
*/
@Override
public String getDefaultBucket() {
return defaultBucket;
return getDefaultProvider().getBucketName();
}
/**
* 获取上传结果(包含文件信息和访问URL)
* @param fileKey
* @param expiration
* @return
* 获取上传结果
*/
@Override
public UploadResult getUploadResult(String fileKey, Duration expiration) {
try {
// 获取文件信息
OssFile file = ossFileService.getFileByKey(fileKey);
// 生成访问URL
if (file == null) {
throw new BusinessException("文件不存在: " + fileKey);
}
String accessUrl = getFileUrl(fileKey, expiration);
String url = accessUrl.split("\\?")[0];
// 使用 split 方法以 "?" 为分隔符分割字符串
String[] parts = accessUrl.split("\\?");
String url = parts[0]; // 取问号之前的部分
// 创建上传结果
UploadResult result = new UploadResult();
result.setFileKey(fileKey);
result.setAccessUrl(accessUrl);
......@@ -807,100 +614,57 @@ public class AliYunOssServiceImpl implements OssService {
result.setFileType(file.getFileType());
result.setOriginalName(file.getOriginalName());
result.setUploadTime(file.getUploadTime());
return result;
} catch (Exception e) {
log.error("获取上传结果失败: {}", fileKey, e);
throw new RuntimeException("获取上传结果失败: " + fileKey, e);
}
}
/**
* 创建虚拟文件记录(用于操作日志)
* @return
*/
private OssFile createDummyOssFile() {
OssFile file = new OssFile();
file.setId(-1L); // 使用无效ID
return file;
}
/**
* 上传字节数组到OSS并设置为公共读权限
* @param content 文件内容字节数组
* @param fileName 文件名
* @return 公共访问URL
* 上传字节数组并设置公共读(示例方法)
*/
public String upload(byte[] content, String fileName) {
OssProvider defaultProvider = getDefaultProvider();
OSS ossClient = null;
try {
// 生成唯一文件名
ossClient = ossClientFactory.createOssClient(defaultProvider);
String objectName = "appointment/excel/" + UUID.randomUUID() + "/" + fileName;
// 创建上传请求
PutObjectRequest putObjectRequest = new PutObjectRequest(
defaultBucket,
objectName,
new ByteArrayInputStream(content)
);
// 上传文件
realOssClient.putObject(putObjectRequest);
// 设置对象访问权限为公共读
realOssClient.setObjectAcl(defaultBucket, objectName, CannedAccessControlList.PublicRead);
// 构造公共访问URL
String publicUrl = "https://" + defaultBucket + "." + defaultEndpoint + "/" + objectName;
return publicUrl;
} catch (Exception e) {
throw new RuntimeException("上传文件到OSS失败", e);
defaultProvider.getBucketName(), objectName, new ByteArrayInputStream(content));
ossClient.putObject(putObjectRequest);
ossClient.setObjectAcl(defaultProvider.getBucketName(), objectName, CannedAccessControlList.PublicRead);
return "https://" + defaultProvider.getBucketName() + "." + defaultProvider.getEndpoint() + "/" + objectName;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
* 上传输入流到OSS并设置为公共读权限
* @param inputStream 文件输入流
* @param fileName 文件名
* @return 公共访问URL
* 上传输入流并设置公共读
*/
public String upload(InputStream inputStream, String fileName) {
OssProvider defaultProvider = getDefaultProvider();
OSS ossClient = null;
try {
// 生成唯一文件名
ossClient = ossClientFactory.createOssClient(defaultProvider);
String objectName = "appointment/excel/" + UUID.randomUUID() + "/" + fileName;
// 创建上传请求
PutObjectRequest putObjectRequest = new PutObjectRequest(
defaultBucket,
objectName,
inputStream
);
// 上传文件
realOssClient.putObject(putObjectRequest);
// 设置对象访问权限为公共读
realOssClient.setObjectAcl(defaultBucket, objectName, CannedAccessControlList.PublicRead);
// 构造公共访问URL
String publicUrl = "https://" + defaultBucket + "." + defaultEndpoint + "/" + objectName;
return publicUrl;
} catch (Exception e) {
throw new RuntimeException("上传文件到OSS失败", e);
defaultProvider.getBucketName(), objectName, inputStream);
ossClient.putObject(putObjectRequest);
ossClient.setObjectAcl(defaultProvider.getBucketName(), objectName, CannedAccessControlList.PublicRead);
return "https://" + defaultProvider.getBucketName() + "." + defaultProvider.getEndpoint() + "/" + objectName;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
* 批量上传文件
* @param files 文件列表
* @param reqDto 上传请求参数
* @return 批量上传响应
*/
@Override
public com.yd.oss.feign.response.ApiBatchUploadResponse batchUploadFiles(
java.util.List<MultipartFile> files, OssUploadFileReqDto reqDto) {
com.yd.oss.feign.response.ApiBatchUploadResponse response = new com.yd.oss.feign.response.ApiBatchUploadResponse();
java.util.List<com.yd.oss.feign.response.ApiUploadResponse> successFiles = new java.util.ArrayList<>();
java.util.List<com.yd.oss.feign.response.ApiBatchUploadResponse.FailedFile> failedFiles = new java.util.ArrayList<>();
......@@ -915,10 +679,7 @@ public class AliYunOssServiceImpl implements OssService {
for (MultipartFile file : files) {
try {
// 调用单文件上传方法
OssUploadFileResDto uploadResult = uploadFileBody(file, reqDto);
// 转换为ApiUploadResponse
com.yd.oss.feign.response.ApiUploadResponse uploadResponse = new com.yd.oss.feign.response.ApiUploadResponse();
uploadResponse.setFileBizId(uploadResult.getFileBizId());
uploadResponse.setFileKey(uploadResult.getFileKey());
......@@ -926,7 +687,6 @@ public class AliYunOssServiceImpl implements OssService {
uploadResponse.setUrl(uploadResult.getUrl());
uploadResponse.setFileSize(uploadResult.getFileSize());
uploadResponse.setFileType(uploadResult.getFileType());
successFiles.add(uploadResponse);
} catch (Exception e) {
log.error("批量上传文件失败: {}", file.getOriginalFilename(), e);
......@@ -942,9 +702,23 @@ public class AliYunOssServiceImpl implements OssService {
response.setFailedFiles(failedFiles);
response.setSuccessCount(successFiles.size());
response.setFailedCount(failedFiles.size());
log.info("批量上传完成: 成功{}个, 失败{}个", successFiles.size(), failedFiles.size());
return response;
}
/**
* 记录操作日志(公共方法)
*/
private void recordOperationLog(String fileBizId, String operationType, String operator,
String result, String errorMsg, long startTime) {
OssOperationLog operationLog = new OssOperationLog();
operationLog.setFileBizId(fileBizId);
operationLog.setOperationType(operationType);
operationLog.setOperationUser(operator);
operationLog.setOperationResult(result);
operationLog.setErrorMessage(errorMsg);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
ossFileService.saveOperationLog(operationLog);
}
}
\ No newline at end of file
......@@ -40,7 +40,7 @@ public class AppointmentExcelServiceImpl implements AppointmentExcelService {
* @param fileName
* @return
*/
public String exportAndUploadToOss(Map<String, Object> data, String ossObjectKey, String fileName) {
public String exportAndUploadToOss(Map<String, Object> data, String ossObjectKey, String fileName,String projectBizId) {
File tempFile = null;
File processedFile = null;
......@@ -301,12 +301,13 @@ public class AppointmentExcelServiceImpl implements AppointmentExcelService {
@Override
public String exportAppointment(Map<String, Object> data,
String templateType,
String appointmentBizId) {
String appointmentBizId,
String projectBizId) {
// 获取模板信息
FileProdDto fileProdDto = iFileTemplateService.getFileProd("", templateType);
// 生成文件名
String fileName = "预约信息_" + appointmentBizId + "_" + System.currentTimeMillis() + ".xlsx";
// 导出并上传到OSS
return exportAndUploadToOss(data, fileProdDto.getFileKey(), fileName);
return exportAndUploadToOss(data, fileProdDto.getFileKey(), fileName,projectBizId);
}
}
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