From d6db49e6210a770beec058f444836f42f3f71cfa Mon Sep 17 00:00:00 2001
From: PhoenixL <545073804@qq.com>
Date: 星期四, 09 五月 2024 17:17:03 +0800
Subject: [PATCH] update 优化文件下载
---
ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java | 39 +++++++++++++++++++++++++++++++++++----
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java | 11 ++---------
2 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
index 5533297..fcad35b 100644
--- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
+++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
@@ -14,11 +14,14 @@
import org.dromara.common.oss.properties.OssProperties;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.core.ResponseInputStream;
import software.amazon.awssdk.core.async.AsyncRequestBody;
+import software.amazon.awssdk.core.async.AsyncResponseTransformer;
import software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.S3Configuration;
+import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.NoSuchBucketException;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
@@ -26,10 +29,7 @@
import software.amazon.awssdk.transfer.s3.model.*;
import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
@@ -261,6 +261,37 @@
}
/**
+ * 涓嬭浇鏂囦欢浠� Amazon S3 鍒� 杈撳嚭娴�
+ *
+ * @param key 鏂囦欢鍦� Amazon S3 涓殑瀵硅薄閿�
+ * @param out 杈撳嚭娴�
+ * @return 杈撳嚭娴佷腑鍐欏叆鐨勫瓧鑺傛暟锛堥暱搴︼級
+ * @throws OssException 濡傛灉涓嬭浇澶辫触锛屾姏鍑鸿嚜瀹氫箟寮傚父
+ */
+ public long download(String key, OutputStream out) {
+ try {
+ // 鏋勫缓涓嬭浇璇锋眰
+ DownloadRequest<ResponseInputStream<GetObjectResponse>> downloadRequest = DownloadRequest.builder()
+ // 鏂囦欢瀵硅薄
+ .getObjectRequest(y -> y.bucket(properties.getBucketName())
+ .key(key)
+ .build())
+ .addTransferListener(LoggingTransferListener.create())
+ // 浣跨敤璁㈤槄杞崲鍣�
+ .responseTransformer(AsyncResponseTransformer.toBlockingInputStream())
+ .build();
+ // 浣跨敤 S3TransferManager 涓嬭浇鏂囦欢
+ Download<ResponseInputStream<GetObjectResponse>> responseFuture = transferManager.download(downloadRequest);
+ // 杈撳嚭鍒版祦涓�
+ try (ResponseInputStream<GetObjectResponse> responseStream = responseFuture.completionFuture().join().result()) { // auto-closeable stream
+ return responseStream.transferTo(out); // 闃诲璋冪敤绾跨▼ blocks the calling thread
+ }
+ } catch (Exception e) {
+ throw new OssException("鏂囦欢涓嬭浇澶辫触锛岄敊璇俊鎭�:[" + e.getMessage() + "]");
+ }
+ }
+
+ /**
* 鍒犻櫎浜戝瓨鍌ㄦ湇鍔′腑鎸囧畾璺緞涓嬫枃浠�
*
* @param path 鎸囧畾璺緞
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
index 1df221c..e4649f1 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
@@ -1,7 +1,6 @@
package org.dromara.system.service.impl;
import cn.hutool.core.convert.Convert;
-import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -35,7 +34,6 @@
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -157,13 +155,8 @@
FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
OssClient storage = OssFactory.instance(sysOss.getService());
- try (InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) {
- int available = inputStream.available();
- IoUtil.copy(inputStream, response.getOutputStream(), available);
- response.setContentLength(available);
- } catch (Exception e) {
- throw new ServiceException(e.getMessage());
- }
+ long contentLength = storage.download(sysOss.getFileName(), response.getOutputStream());
+ response.setContentLengthLong(contentLength);
}
/**
--
Gitblit v1.9.3