From 4cf4446b163d4322655918bacdaa358e1587cc9c Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Wed, 08 Apr 2026 11:28:02 +0800
Subject: [PATCH] opt: 下载文件改造
---
drone-ops/drone-resource/src/main/java/org/sxkj/resource/service/impl/AttachServiceImpl.java | 56 +++++++++++++++++++++++++++++++-------------------------
1 files changed, 31 insertions(+), 25 deletions(-)
diff --git a/drone-ops/drone-resource/src/main/java/org/sxkj/resource/service/impl/AttachServiceImpl.java b/drone-ops/drone-resource/src/main/java/org/sxkj/resource/service/impl/AttachServiceImpl.java
index 97ea791..c4df057 100644
--- a/drone-ops/drone-resource/src/main/java/org/sxkj/resource/service/impl/AttachServiceImpl.java
+++ b/drone-ops/drone-resource/src/main/java/org/sxkj/resource/service/impl/AttachServiceImpl.java
@@ -51,6 +51,7 @@
import org.sxkj.resource.builder.OssBuilder;
import org.sxkj.resource.dto.WaylineJobInfoQueryParam;
import org.sxkj.resource.entity.Attach;
+import org.sxkj.resource.entity.Oss;
import org.sxkj.resource.mapper.AttachMapper;
import org.sxkj.resource.model.FileMetadataDTO;
import org.sxkj.resource.model.MinioPojo;
@@ -788,57 +789,64 @@
*
* @param param 下载参数
* @param outputStream 输出流
- * @return
- * @throws IOException
+ * @return 下载是否成功
+ * @throws IOException IO异常
*/
@Override
public Boolean downloadByByte(String param, OutputStream outputStream) throws IOException {
+ // 步骤1:构建下载参数并获取附件列表
AttachmentDownloadParam attachmentDownloadParam = new AttachmentDownloadParam();
attachmentDownloadParam.setAttachIds(Func.toLongList(param));
- // 获取附件列表
List<AttachVO> attachList = getAttachList(attachmentDownloadParam);
if (CollectionUtils.isEmpty(attachList)) {
return false;
}
+ // 步骤2:获取当前租户ID
+ String tenantId = AuthUtil.getTenantId();
+ if (StringUtils.isBlank(tenantId)) {
+ tenantId = "000000";
+ }
+
+ // 步骤3:通过OssBuilder获取OSS配置
+ Oss oss = ossBuilder.getOss(tenantId, "");
+
try {
- // 直接使用传入的输出流创建ZipOutputStream
+ // 步骤4:创建ZipOutputStream并设置压缩级别
ZipOutputStream zos = new ZipOutputStream(outputStream);
- // 使用BEST_SPEED而不是BEST_COMPRESSION,提高速度
zos.setLevel(Deflater.BEST_SPEED);
- // 使用较小的缓冲区,减少内存使用
- final int BUFFER_SIZE = 1024 * 1024; // 1MB
+ // 步骤5:设置缓冲区大小
+ final int BUFFER_SIZE = 1024 * 1024;
byte[] buffer = new byte[BUFFER_SIZE];
- // 创建Minio客户端
+ // 步骤6:根据OSS配置创建MinioClient
MinioClient minioClient = MinioClient.builder()
- .endpoint(minioPojo.getPath())
- .credentials(minioPojo.getAccessKey(), minioPojo.getSecretKey())
+ .endpoint(oss.getEndpoint())
+ .credentials(oss.getAccessKey(), oss.getSecretKey())
.build();
- // 创建一个Set来跟踪已经使用的文件名,避免重名
+ // 步骤7:创建文件名集合用于去重
Set<String> usedFileNames = new HashSet<>();
- // 直接遍历所有附件,不再按任务分组
+ // 步骤8:遍历附件列表,逐个下载并打包
for (AttachVO attachVO : attachList) {
String objectName = attachVO.getName();
try {
- // 从MinIO获取文件流
+ // 步骤8.1:从MinIO获取文件流
InputStream is = minioClient.getObject(
GetObjectArgs.builder()
- .bucket(minioPojo.getBucket())
+ .bucket(oss.getBucketName())
.object(objectName)
.build());
- // 提取文件名(不包含路径)
+ // 步骤8.2:提取文件名(不包含路径)
String fileName = objectName.substring(objectName.lastIndexOf("/") + 1);
- // 处理文件名冲突
+ // 步骤8.3:处理文件名冲突
String uniqueFileName = fileName;
int counter = 1;
while (usedFileNames.contains(uniqueFileName)) {
- // 如果文件名已存在,在文件名和扩展名之间添加计数器
int dotIndex = fileName.lastIndexOf(".");
if (dotIndex > 0) {
uniqueFileName = fileName.substring(0, dotIndex) + "_" + counter + fileName.substring(dotIndex);
@@ -848,33 +856,30 @@
counter++;
}
- // 将文件名添加到已使用集合中
+ // 步骤8.4:记录已使用的文件名
usedFileNames.add(uniqueFileName);
- // 创建zip条目(直接放在根目录下)
+ // 步骤8.5:创建ZIP条目并写入文件内容
ZipEntry zipEntry = new ZipEntry(uniqueFileName);
zos.putNextEntry(zipEntry);
- // 将文件内容写入zip
int length;
while ((length = is.read(buffer)) > 0) {
zos.write(buffer, 0, length);
- // 每写入一块数据后刷新,确保数据及时发送到客户端
zos.flush();
}
- // 关闭资源
+ // 步骤8.6:关闭当前条目和输入流
zos.closeEntry();
is.close();
} catch (Exception e) {
log.error("处理文件 {} 失败: {}", objectName, e.getMessage());
}
}
- // 确保所有数据都被写入
+
+ // 步骤9:完成ZIP文件写入
zos.finish();
zos.flush();
- // 注意:不要关闭ZipOutputStream,因为它会关闭底层的OutputStream
- // 让调用者负责关闭输出流
return true;
@@ -882,6 +887,7 @@
log.error("创建zip文件失败", e);
return false;
} finally {
+ // 步骤10:确保输出流被正确关闭
if (outputStream != null) {
try {
outputStream.flush();
--
Gitblit v1.9.3