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