Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-oss
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xingmin
yd-oss
Commits
06cbc20d
Commit
06cbc20d
authored
Mar 17, 2026
by
zhangxingmin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
push
parent
0378b7bd
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
464 additions
and
623 deletions
+464
-623
yd-oss-api/src/main/java/com/yd/oss/api/service/impl/ApiExcelServiceImpl.java
+19
-5
yd-oss-api/src/main/java/com/yd/oss/api/service/impl/ApiOssStsServiceImpl.java
+48
-53
yd-oss-feign/src/main/java/com/yd/oss/feign/request/ApiOssExportAppointmentExcelRequest.java
+1
-1
yd-oss-service/src/main/java/com/yd/oss/service/config/DynamicOssClientProxy.java
+32
-32
yd-oss-service/src/main/java/com/yd/oss/service/config/OssClientFactory.java
+55
-0
yd-oss-service/src/main/java/com/yd/oss/service/config/OssConfig.java
+13
-13
yd-oss-service/src/main/java/com/yd/oss/service/service/AppointmentExcelService.java
+2
-1
yd-oss-service/src/main/java/com/yd/oss/service/service/impl/AliYunOssServiceImpl.java
+290
-515
yd-oss-service/src/main/java/com/yd/oss/service/service/impl/AppointmentExcelServiceImpl.java
+4
-3
No files found.
yd-oss-api/src/main/java/com/yd/oss/api/service/impl/ApiExcelServiceImpl.java
View file @
06cbc20d
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
);
}
...
...
yd-oss-api/src/main/java/com/yd/oss/api/service/impl/ApiOssStsServiceImpl.java
View file @
06cbc20d
...
...
@@ -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
);
// 构建响应
...
...
yd-oss-feign/src/main/java/com/yd/oss/feign/request/ApiOssExportAppointmentExcelRequest.java
View file @
06cbc20d
...
...
@@ -27,5 +27,5 @@ public class ApiOssExportAppointmentExcelRequest {
/**
* 项目ID
*/
private
String
projectBizId
=
"project_nKULQBH1Gw9Ma8YM"
;
private
String
projectBizId
;
}
yd-oss-service/src/main/java/com/yd/oss/service/config/DynamicOssClientProxy.java
View file @
06cbc20d
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
yd-oss-service/src/main/java/com/yd/oss/service/config/OssClientFactory.java
0 → 100644
View file @
06cbc20d
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
yd-oss-service/src/main/java/com/yd/oss/service/config/OssConfig.java
View file @
06cbc20d
...
...
@@ -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
;
...
...
yd-oss-service/src/main/java/com/yd/oss/service/service/AppointmentExcelService.java
View file @
06cbc20d
...
...
@@ -6,5 +6,6 @@ public interface AppointmentExcelService {
String
exportAppointment
(
Map
<
String
,
Object
>
data
,
String
templateType
,
String
appointmentBizId
);
String
appointmentBizId
,
String
projectBizId
);
}
yd-oss-service/src/main/java/com/yd/oss/service/service/impl/AliYunOssServiceImpl.java
View file @
06cbc20d
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
Oss
Provider
currentProvider
;
// 注入当前提供商
private
Oss
ClientFactory
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
);
// 上传文件
realO
ssClient
.
putObject
(
putObjectRequest
);
o
ssClient
.
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
(
currentP
rovider
.
getProviderBizId
());
ossFile
.
setProviderBizId
(
p
rovider
.
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
yd-oss-service/src/main/java/com/yd/oss/service/service/impl/AppointmentExcelServiceImpl.java
View file @
06cbc20d
...
...
@@ -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
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment