From 49f09b324539e1744dd7e900a7a2973610436c76 Mon Sep 17 00:00:00 2001 From: sol Date: Wed, 24 Sep 2025 01:42:01 +0800 Subject: [PATCH] feat(file): Add file download function and optimize MinIO client usage --- .../web/file/file/controller/FileController.java | 14 ++++++++++++++ .../file/image/controller/ImageController.java | 16 ++++++++++++++++ .../file/video/controller/VideoController.java | 1 - 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/file/controller/FileController.java b/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/file/controller/FileController.java index 46dabe8..5c1204c 100644 --- a/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/file/controller/FileController.java +++ b/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/file/controller/FileController.java @@ -11,10 +11,14 @@ import com.bgasol.model.file.file.dto.FileUpdateDto; import com.bgasol.model.file.file.entity.FileEntity; import com.bgasol.plugin.minio.service.OssService; import com.bgasol.web.file.file.service.FileService; +import io.minio.MinioClient; +import io.minio.StatObjectArgs; +import io.minio.StatObjectResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; @@ -38,6 +42,7 @@ public class FileController extends BaseController< private final FileService fileService; private final OssService ossService; + private final MinioClient minioClient; @Override public FileService commonBaseService() { @@ -84,12 +89,21 @@ public class FileController extends BaseController< return super.findById(id); } + @SneakyThrows @GetMapping("/download/{id}") @Operation(summary = "下载文件", operationId = "downloadFile") @SaCheckPermission("file:download") public ResponseEntity download(@PathVariable("id") String id) { FileEntity file = fileService.findById(id); + String bucket = file.getBucket(); + String objectName = ossService.buildObjectPath(file); + + StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder() + .bucket(bucket) + .object(objectName) + .build()); return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(stat.size())) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode( fileService.getFileName(file), StandardCharsets.UTF_8 diff --git a/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/image/controller/ImageController.java b/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/image/controller/ImageController.java index 4a14dfb..63ab544 100644 --- a/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/image/controller/ImageController.java +++ b/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/image/controller/ImageController.java @@ -9,12 +9,17 @@ import com.bgasol.model.file.image.dto.ImageCreateDto; import com.bgasol.model.file.image.dto.ImagePageDto; import com.bgasol.model.file.image.dto.ImageUpdateDto; import com.bgasol.model.file.image.entity.ImageEntity; +import com.bgasol.plugin.minio.service.OssService; import com.bgasol.web.file.file.service.FileService; import com.bgasol.web.file.image.service.ImageService; +import io.minio.MinioClient; +import io.minio.StatObjectArgs; +import io.minio.StatObjectResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -36,6 +41,8 @@ public class ImageController extends BaseController< private final ImageService imageService; private final FileService fileService; + private final OssService ossService; + private final MinioClient minioClient; @Override public ImageService commonBaseService() { @@ -82,13 +89,22 @@ public class ImageController extends BaseController< return super.delete(ids); } + @SneakyThrows @GetMapping("/download/{id}") @Operation(summary = "下载图片", operationId = "downloadImage") @SaCheckPermission("file:download") public ResponseEntity download(@PathVariable("id") String id) { ImageEntity imageEntity = imageService.findById(id); FileEntity file = imageEntity.getFile(); + String bucket = file.getBucket(); + String objectName = ossService.buildObjectPath(file); + + StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder() + .bucket(bucket) + .object(objectName) + .build()); return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(stat.size())) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode( fileService.getFileName(file), StandardCharsets.UTF_8 diff --git a/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/video/controller/VideoController.java b/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/video/controller/VideoController.java index b6160dd..05de3a8 100644 --- a/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/video/controller/VideoController.java +++ b/cloud/web/web-file-8082/src/main/java/com/bgasol/web/file/video/controller/VideoController.java @@ -102,7 +102,6 @@ public class VideoController extends BaseController< String bucket = file.getBucket(); String objectName = ossService.buildObjectPath(file); - // ----------- 用 MinIO 获取对象大小(HEAD / stat) ----------- StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder() .bucket(bucket) .object(objectName)