From 8b8df575535b5c04ac9fb107716158844a89db95 Mon Sep 17 00:00:00 2001 From: dftre <3066417822@qq.com> Date: Thu, 14 Nov 2024 14:02:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E6=96=87=E4=BB=B6=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/domain/entity/FileEntity.java | 37 ++++++++++ .../common/service/file/DiskFileService.java | 24 ++++++- .../common/service/file/FileService.java | 11 +++ .../middleware/minio/config/MinioConfig.java | 1 + .../minio/controller/MinioController.java | 14 ++-- .../middleware/minio/domain/MinioBucket.java | 36 ++++------ .../middleware/minio/domain/MinioFileVO.java | 24 ++----- .../minio/service/MinioFileService.java | 13 ++++ .../oss/controller/AliOssController.java | 52 ++++---------- .../alibaba/oss/domain/AliOssBucket.java | 55 ++++----------- .../alibaba/oss/domain/AliOssFileVO.java | 41 ++++------- .../oss/service/AliOssFileService.java | 13 ++++ .../ruoyi/alibaba/oss/utils/AliOssUtil.java | 69 +++---------------- 13 files changed, 168 insertions(+), 222 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/FileEntity.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/FileEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/FileEntity.java new file mode 100644 index 0000000..b7e681c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/FileEntity.java @@ -0,0 +1,37 @@ +package com.ruoyi.common.core.domain.entity; + +import java.io.InputStream; + +public class FileEntity { + private InputStream fileInputSteam; + private Long byteCount; + private String filePath; + + public FileEntity() { + } + + public InputStream getFileInputSteam() { + return fileInputSteam; + } + + public void setFileInputSteam(InputStream fileInputSteam) { + this.fileInputSteam = fileInputSteam; + } + + public Long getByteCount() { + return byteCount; + } + + public void setByteCount(Long byteCount) { + this.byteCount = byteCount; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/service/file/DiskFileService.java b/ruoyi-common/src/main/java/com/ruoyi/common/service/file/DiskFileService.java index ad73270..eb0d4ed 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/service/file/DiskFileService.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/service/file/DiskFileService.java @@ -15,6 +15,7 @@ import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.FileEntity; import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; @@ -105,11 +106,32 @@ public class DiskFileService implements FileService { if (file.isFile() && file.exists()) { String md5 = Md5Utils.getMd5(file); flag = file.delete(); - if(flag) { + if (flag) { FileOperateUtils.deleteFileAndMd5ByMd5(md5); } } return flag; } + /** + * 获取文件 + * + * @param filePath + * @return + * @throws Exception + */ + @Override + public FileEntity getFile(String filePath) throws Exception { + String localPath = RuoYiConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(filePath, Constants.RESOURCE_PREFIX); + File file = new File(downloadPath); + if (!file.exists()) { + throw new FileNotFoundException("未找到文件"); + } + FileInputStream fileInputStream = new FileInputStream(file); + FileEntity fileEntity = new FileEntity(); + fileEntity.setFileInputSteam(fileInputStream); + fileEntity.setByteCount(file.length()); + return fileEntity; + }; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/service/file/FileService.java b/ruoyi-common/src/main/java/com/ruoyi/common/service/file/FileService.java index a6f6580..17b29bf 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/service/file/FileService.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/service/file/FileService.java @@ -5,6 +5,8 @@ import java.io.InputStream; import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.core.domain.entity.FileEntity; + //默认上传下载 /** * 文件操作接口 @@ -74,4 +76,13 @@ public interface FileService { * */ public boolean deleteFile(String filePath) throws Exception; + + /** + * 获取文件 + * + * @param filePath + * @return + * @throws Exception + */ + public FileEntity getFile(String filePath) throws Exception; } diff --git a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/config/MinioConfig.java b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/config/MinioConfig.java index 68aebc1..1e2df88 100644 --- a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/config/MinioConfig.java +++ b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/config/MinioConfig.java @@ -51,6 +51,7 @@ public class MinioConfig implements InitializingBean { .stream(EmptyInputStream.nullInputStream(), 0, -1).bucket(minioBucket.getBuketName()).build(); minioBucket.getClient().putObject(putObjectArgs); } catch (Exception e) { + logger.error("数据桶:{} - 链接失败", minioBucket.getName()); throw new RuntimeException(e.getMessage()); } if (!b) { diff --git a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/controller/MinioController.java b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/controller/MinioController.java index f5685c6..0df806a 100644 --- a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/controller/MinioController.java +++ b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/controller/MinioController.java @@ -14,9 +14,7 @@ import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.middleware.minio.domain.MinioFileVO; import com.ruoyi.middleware.minio.utils.MinioUtil; -import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import okhttp3.Headers; @RestController @RequestMapping("/minio") @@ -24,20 +22,20 @@ public class MinioController { @GetMapping("/{client}") @Anonymous - public void downLoadFile(HttpServletRequest request, HttpServletResponse response, + public void downLoadFile(HttpServletResponse response, @PathVariable("client") String client, @RequestParam("fileName") String fileName) throws Exception { MinioFileVO file = MinioUtil.getFile(client, fileName); - Headers headers = file.getHeaders(); - String contentType = headers.get("content-Type"); - response.setContentType(contentType); + FileUtils.setAttachmentResponseHeader(response, FileUtils.getName(fileName)); + response.setContentLengthLong(file.getByteCount()); FileUtils.writeBytes(file.getFileInputSteam(), response.getOutputStream()); } @PutMapping("/{client}") @Anonymous - public String uploadFile(HttpServletRequest request, HttpServletResponse response, - @PathVariable("client") String client, @RequestBody MultipartFile file) throws Exception { + public String uploadFile( + @PathVariable("client") String client, + @RequestBody MultipartFile file) throws Exception { return MinioUtil.uploadFile(client, file); } } diff --git a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/domain/MinioBucket.java b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/domain/MinioBucket.java index 84b9c1e..bde9361 100644 --- a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/domain/MinioBucket.java +++ b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/domain/MinioBucket.java @@ -1,12 +1,10 @@ package com.ruoyi.middleware.minio.domain; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import org.springframework.web.multipart.MultipartFile; -import com.ruoyi.middleware.minio.config.MinioConfig; import com.ruoyi.middleware.minio.exception.MinioClientErrorException; import io.minio.GetObjectArgs; @@ -14,7 +12,6 @@ import io.minio.GetObjectResponse; import io.minio.MinioClient; import io.minio.PutObjectArgs; import io.minio.RemoveObjectArgs; -import com.ruoyi.common.exception.file.FileException; public class MinioBucket { @@ -77,25 +74,6 @@ public class MinioBucket { this.client.removeObject(removeObjectArgs); } - public MinioFileVO get(GetObjectArgs getObjectArgs) throws Exception { - GetObjectResponse inputStream = this.client.getObject(getObjectArgs); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - byte[] bytes = new byte[MinioConfig.maxSize]; - int length = 0; - while (true) { - try { - if (!((length = inputStream.read(bytes, 0, bytes.length)) > 0)) { - break; - } - } catch (Exception e) { - throw new FileException("500", new String[] { e.getMessage() }); - } - byteArrayOutputStream.write(bytes, 0, length); - } - return new MinioFileVO(inputStream, inputStream.object(), inputStream.headers(), inputStream.bucket(), - inputStream.region()); - } - /** * 文件下载 * @@ -105,7 +83,17 @@ public class MinioBucket { * @throws IOException 比如读写文件出错时 */ public MinioFileVO get(String filePath) throws Exception { - GetObjectArgs build = GetObjectArgs.builder().object(filePath).bucket(buketName).build(); - return get(build); + GetObjectArgs getObjectArgs = GetObjectArgs.builder().object(filePath).bucket(buketName).build(); + GetObjectResponse inputStream = this.client.getObject(getObjectArgs); + MinioFileVO minioFileVO = new MinioFileVO(); + + minioFileVO.setFileInputSteam(inputStream); + minioFileVO.setByteCount(inputStream.headers().byteCount()); + minioFileVO.setFilePath(filePath); + minioFileVO.setObject(inputStream.object()); + minioFileVO.setRegion(inputStream.region()); + minioFileVO.setBuket(inputStream.bucket()); + minioFileVO.setHeaders(inputStream.headers()); + return minioFileVO; } } diff --git a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/domain/MinioFileVO.java b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/domain/MinioFileVO.java index 7170cee..411272f 100644 --- a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/domain/MinioFileVO.java +++ b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/domain/MinioFileVO.java @@ -1,25 +1,17 @@ package com.ruoyi.middleware.minio.domain; +import com.ruoyi.common.core.domain.entity.FileEntity; + import okhttp3.Headers; -import java.io.InputStream; - -public class MinioFileVO { - private InputStream fileInputSteam; +public class MinioFileVO extends FileEntity { private String object; private Headers headers; private String buket; private String region; public MinioFileVO() { - } - - public InputStream getFileInputSteam() { - return fileInputSteam; - } - - public void setFileInputSteam(InputStream fileInputSteam) { - this.fileInputSteam = fileInputSteam; + super(); } public String getObject() { @@ -54,12 +46,4 @@ public class MinioFileVO { this.region = region; } - public MinioFileVO(InputStream fileInputSteam, String object, Headers headers, String buket, String region) { - this.fileInputSteam = fileInputSteam; - this.object = object; - this.headers = headers; - this.buket = buket; - this.region = region; - } - } diff --git a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/service/MinioFileService.java b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/service/MinioFileService.java index 07e25e0..90601f4 100644 --- a/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/service/MinioFileService.java +++ b/ruoyi-middleware/ruoyi-middleware-minio/src/main/java/com/ruoyi/middleware/minio/service/MinioFileService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.domain.entity.FileEntity; import com.ruoyi.common.service.file.FileService; import com.ruoyi.common.utils.file.FileOperateUtils; import com.ruoyi.common.utils.file.FileUtils; @@ -65,4 +66,16 @@ public class MinioFileService implements FileService { FileOperateUtils.deleteFileAndMd5ByFilePath(filePath); return true; } + + /** + * 获取文件 + * + * @param filePath + * @return + * @throws Exception + */ + @Override + public FileEntity getFile(String filePath) throws Exception { + return MinioUtil.getFile(minioConfig.getPrimary(), filePath); + }; } diff --git a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/controller/AliOssController.java b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/controller/AliOssController.java index 598f864..e65869c 100644 --- a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/controller/AliOssController.java +++ b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/controller/AliOssController.java @@ -1,11 +1,5 @@ package com.ruoyi.alibaba.oss.controller; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; @@ -16,53 +10,33 @@ import org.springframework.web.multipart.MultipartFile; import com.ruoyi.alibaba.oss.domain.AliOssFileVO; import com.ruoyi.alibaba.oss.utils.AliOssUtil; +import com.ruoyi.common.annotation.Anonymous; +import com.ruoyi.common.utils.file.FileUtils; import io.swagger.v3.oas.annotations.Operation; -import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @RestController @RequestMapping("/oss") public class AliOssController { - @Autowired - private AliOssUtil aliOssUtil; - @Operation(summary = "下载接口oss") @GetMapping("/{client}") - public void downLoadFile(HttpServletRequest request, HttpServletResponse response,@PathVariable("client") String client, - @RequestParam("fileName") String fileName) throws Exception { - AliOssFileVO file = aliOssUtil.getFile(client, fileName); - // 设置响应头 - String contentType = file.getHeaders().getOrDefault("Content-Type", "application/octet-stream"); - response.setContentType(contentType); - - // 设置内容长度 - String contentLength = file.getHeaders().get("Content-Length"); - if (contentLength != null) { - response.setContentLengthLong(Long.parseLong(contentLength)); - } - response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\""); - // 写入文件内容到响应流 - try (InputStream inputStream = file.getFileInputSteam(); - OutputStream outputStream = response.getOutputStream()) { - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - outputStream.flush(); - } catch (IOException e) { - throw new IOException("Error writing file to output stream", e); - } + @Anonymous + public void downLoadFile(HttpServletResponse response, + @PathVariable("client") String client, + @RequestParam("fileName") String fileName) throws Exception { + AliOssFileVO file = AliOssUtil.getFile(client, fileName); + FileUtils.setAttachmentResponseHeader(response, FileUtils.getName(fileName)); + response.setContentLengthLong(file.getByteCount()); + FileUtils.writeBytes(file.getFileInputSteam(), response.getOutputStream()); } - - //上传接口 + // 上传接口 @Operation(summary = "上传接口oss") @PutMapping("/{client}") - public String uploadFile(HttpServletRequest request, HttpServletResponse response, - @PathVariable("client") String client, @RequestParam("file") MultipartFile file) throws Exception { + public String uploadFile(@PathVariable("client") String client, @RequestParam("file") MultipartFile file) + throws Exception { return AliOssUtil.uploadFile(client, file); } } diff --git a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/domain/AliOssBucket.java b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/domain/AliOssBucket.java index 3658edb..509e842 100644 --- a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/domain/AliOssBucket.java +++ b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/domain/AliOssBucket.java @@ -1,11 +1,7 @@ package com.ruoyi.alibaba.oss.domain; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.InputStream; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,7 +57,7 @@ public class AliOssBucket { // 创建 ObjectMetadata 对象,并设置内容类型 ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(contentType); - metadata.setContentLength(inputStream.available()); // 使用 InputStream 的 available 方法 + metadata.setContentLength(inputStream.available()); // 使用 InputStream 的 available 方法 // 创建 PutObjectRequest 对象 PutObjectRequest putRequest = new PutObjectRequest(bucketName, filePath, inputStream, metadata); @@ -99,43 +95,6 @@ public class AliOssBucket { } } - public AliOssFileVO get(GetObjectRequest getObjectRequest) throws Exception { - try (OSSObject ossObject = this.ossClient.getObject(getObjectRequest)) { - if (ossObject == null) { - throw new Exception("Failed to retrieve object from OSS."); - } - - // 读取OSSObject的内容到ByteArrayOutputStream中 - try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { - byte[] bytes = new byte[1024]; // 根据需要调整缓冲区大小 - int length; - while ((length = ossObject.getObjectContent().read(bytes)) != -1) { - byteArrayOutputStream.write(bytes, 0, length); - } - - // 获取 headers - Map headers = new HashMap<>(); - for (Map.Entry entry : ossObject.getObjectMetadata().getUserMetadata().entrySet()) { - headers.put(entry.getKey(), entry.getValue()); - } - headers.put("Content-Type", ossObject.getObjectMetadata().getContentType()); - headers.put("Content-Length", String.valueOf(ossObject.getObjectMetadata().getContentLength())); - - // 设置 AliOssFileVO 对象的属性 - AliOssFileVO fileVO = new AliOssFileVO(); - fileVO.setFileInputSteam(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); - fileVO.setHeaders(headers); - fileVO.setKey(ossObject.getKey()); - fileVO.setBucketName(ossObject.getBucketName()); - - return fileVO; - } - } catch (Exception e) { - logger.error("Error retrieving file: {}", e.getMessage(), e); - throw new AliOssClientErrorException("Error retrieving file: " + e.getMessage(), e); - } - } - /** * 文件下载 * @@ -145,6 +104,16 @@ public class AliOssBucket { */ public AliOssFileVO get(String filePath) throws Exception { GetObjectRequest request = new GetObjectRequest(this.bucketName, filePath); - return get(request); + OSSObject ossObject = this.ossClient.getObject(request); + if (ossObject == null) { + throw new Exception("Failed to retrieve object from OSS."); + } + // 设置 AliOssFileVO 对象的属性 + AliOssFileVO fileVO = new AliOssFileVO(); + fileVO.setFileInputSteam(ossObject.getObjectContent()); + fileVO.setKey(ossObject.getKey()); + fileVO.setBucketName(ossObject.getBucketName()); + fileVO.setByteCount(ossObject.getObjectMetadata().getContentLength()); + return fileVO; } } \ No newline at end of file diff --git a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/domain/AliOssFileVO.java b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/domain/AliOssFileVO.java index caee70b..9689967 100644 --- a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/domain/AliOssFileVO.java +++ b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/domain/AliOssFileVO.java @@ -1,29 +1,14 @@ package com.ruoyi.alibaba.oss.domain; -import java.io.InputStream; -import java.util.Map; +import com.aliyun.oss.model.ObjectMetadata; +import com.ruoyi.common.core.domain.entity.FileEntity; -public class AliOssFileVO { - private InputStream fileInputSteam; +public class AliOssFileVO extends FileEntity { private String key; - private Map headers; private String bucketName; + private ObjectMetadata metadata; - public AliOssFileVO(){} - - public AliOssFileVO(InputStream fileInputSteam, String key, Map headers, String bucketName) { - this.fileInputSteam = fileInputSteam; - this.key = key; - this.headers = headers; - this.bucketName = bucketName; - } - - public InputStream getFileInputSteam() { - return fileInputSteam; - } - - public void setFileInputSteam(InputStream fileInputSteam) { - this.fileInputSteam = fileInputSteam; + public AliOssFileVO() { } public String getKey() { @@ -34,14 +19,6 @@ public class AliOssFileVO { this.key = key; } - public Map getHeaders() { - return headers; - } - - public void setHeaders(Map headers) { - this.headers = headers; - } - public String getBucketName() { return bucketName; } @@ -49,4 +26,12 @@ public class AliOssFileVO { public void setBucketName(String bucketName) { this.bucketName = bucketName; } + + public ObjectMetadata getMetadata() { + return metadata; + } + + public void setMetadata(ObjectMetadata metadata) { + this.metadata = metadata; + } } \ No newline at end of file diff --git a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/service/AliOssFileService.java b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/service/AliOssFileService.java index 0e9fe73..3d639df 100644 --- a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/service/AliOssFileService.java +++ b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/service/AliOssFileService.java @@ -12,6 +12,7 @@ import com.ruoyi.alibaba.oss.config.AliOssConfig; import com.ruoyi.alibaba.oss.domain.AliOssFileVO; import com.ruoyi.alibaba.oss.utils.AliOssUtil; import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.domain.entity.FileEntity; import com.ruoyi.common.service.file.FileService; import com.ruoyi.common.utils.file.FileOperateUtils; import com.ruoyi.common.utils.file.FileUtils; @@ -68,6 +69,18 @@ public class AliOssFileService implements FileService { return true; } + /** + * 获取文件 + * + * @param filePath + * @return + * @throws Exception + */ + @Override + public FileEntity getFile(String filePath) throws Exception { + return AliOssUtil.getFile(filePath); + }; + /** * 提取文件名 * diff --git a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/utils/AliOssUtil.java b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/utils/AliOssUtil.java index 60fac12..9a57c4d 100644 --- a/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/utils/AliOssUtil.java +++ b/ruoyi-plugins/ruoyi-alibaba-oss/src/main/java/com/ruoyi/alibaba/oss/utils/AliOssUtil.java @@ -1,17 +1,10 @@ package com.ruoyi.alibaba.oss.utils; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; -import com.aliyun.oss.OSS; -import com.aliyun.oss.model.GetObjectRequest; -import com.aliyun.oss.model.OSSObject; import com.ruoyi.alibaba.oss.config.AliOssConfig; import com.ruoyi.alibaba.oss.domain.AliOssBucket; import com.ruoyi.alibaba.oss.domain.AliOssFileVO; @@ -43,13 +36,14 @@ public class AliOssUtil { /** * 文件上传 * - * @param client 连接名 - * @param file 上传的文件 + * @param client 连接名 + * @param file 上传的文件 * @return 返回上传成功的文件名 * @throws IOException 比如读写文件出错时 */ public static String uploadFile(String client, MultipartFile file) throws Exception { - String fileName = DateUtils.dateTimeNow() + UUID.fastUUID().toString().substring(0, 5) + "." + FileUtils.getExtension(file); + String fileName = DateUtils.dateTimeNow() + UUID.fastUUID().toString().substring(0, 5) + "." + + FileUtils.getExtension(file); return uploadFile(client, fileName, file); } @@ -126,57 +120,14 @@ public class AliOssUtil { * @throws IOException 比如读写文件出错时 */ public static AliOssFileVO getFile(String client, String filePath) throws Exception { - AliOssBucket ossBucket = client == null ? getAliOssConfig().getMasterBucket() : getAliOssConfig().getBucket(client); - String bucketName = client == null ? getAliOssConfig().getMasterBucketName() : getAliOssConfig().getBucketName(client); - + AliOssBucket ossBucket = client == null ? getAliOssConfig().getMasterBucket() + : getAliOssConfig().getBucket(client); + String bucketName = client == null ? getAliOssConfig().getMasterBucketName() + : getAliOssConfig().getBucketName(client); + if (bucketName == null) { throw new AliOssClientErrorException("参数 \"bucketName\" 为空指针"); } - - GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, filePath); - - return get(getObjectRequest, ossBucket.getOssClient()); - } - /** - * 从OSS中获取文件并封装成AliOssFileVO对象 - * - * @param getObjectRequest 获取对象请求 - * @param ossClient OSS客户端 - * @return 返回封装的Oss下载文件对象 - * @throws Exception 如果获取文件失败 - */ - private static AliOssFileVO get(GetObjectRequest getObjectRequest, OSS ossClient) throws Exception { - OSSObject ossObject = ossClient.getObject(getObjectRequest); - if (ossObject == null) { - throw new Exception("Failed to retrieve object from OSS."); - } - - // 读取OSSObject的内容到ByteArrayOutputStream中 - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - byte[] bytes = new byte[1024]; // 根据需要调整缓冲区大小 - int length; - while ((length = ossObject.getObjectContent().read(bytes)) != -1) { - byteArrayOutputStream.write(bytes, 0, length); - } - - // 获取 headers - Map headers = new HashMap<>(); - for (Map.Entry entry : ossObject.getObjectMetadata().getUserMetadata().entrySet()) { - headers.put(entry.getKey(), entry.getValue()); - } - headers.put("Content-Type", ossObject.getObjectMetadata().getContentType()); - headers.put("Content-Length", String.valueOf(ossObject.getObjectMetadata().getContentLength())); - - // 设置 AliOssFileVO 对象的属性 - AliOssFileVO fileVO = new AliOssFileVO(); - fileVO.setFileInputSteam(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); - fileVO.setHeaders(headers); - fileVO.setKey(ossObject.getKey()); - fileVO.setBucketName(ossObject.getBucketName()); - - // 关闭OSSObject - ossObject.close(); - - return fileVO; + return ossBucket.get(filePath); } } \ No newline at end of file