From d890758c43364f10827ab4af175226d6c1850a76 Mon Sep 17 00:00:00 2001 From: duandazhi Date: Tue, 10 Aug 2021 11:32:54 +0800 Subject: [PATCH] =?UTF-8?q?ceph=20=E5=AE=8C=E5=96=84=20presignedUrl=20obje?= =?UTF-8?q?ctsCapacityStr=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/file/config/CephConfig.java | 24 ++++++++++++ .../file/service/CephDfsServiceImpl.java | 38 +++++++++++++++++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/CephConfig.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/CephConfig.java index 61c29cbf..facb2c73 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/CephConfig.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/CephConfig.java @@ -38,6 +38,18 @@ public class CephConfig { * 最后带不带斜杠都可以 */ private String domain = null; + /** + * 过期时间,单位秒; + * 如:1小时就写:3600L + * 如:9小时就写:32400L + * 如:12小时就写:43200L, 【不支持】,最大是 未知, 最小 1(1秒钟) + * 如:-1: 就永不过期,原样返回url + * 签名URL的默认过期时间为3600秒,最大值为32400秒 + * + * 注意!!:qoniu oss 设置Bucket私有,必须要有凭证才能访问 https://developer.qiniu.com/kodo/1202/download-token + * 下载凭证(如果Bucket设置成私有,必须要有 下载凭证),路径:【对象存储==》使用指南===》安全机制===》 下载凭证】 + */ + private Long expiryDuration = 32400L; public String getAccessKey() { return accessKey; @@ -78,4 +90,16 @@ public class CephConfig { public void setDomain(String domain) { this.domain = domain; } + + public void setExpiryDuration(Long expiryDuration) { + this.expiryDuration = expiryDuration; + } + + public Long getExpiryDuration() { + if (expiryDuration != -1 && expiryDuration < 0) { + // 最小是1秒 + expiryDuration = 1L; + } + return expiryDuration; + } } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/CephDfsServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/CephDfsServiceImpl.java index 928f9cc0..cc28cb6d 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/CephDfsServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/CephDfsServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.file.service; +import cn.hutool.core.date.DateTime; import cn.hutool.extra.spring.SpringUtil; import com.amazonaws.ClientConfiguration; import com.amazonaws.Protocol; @@ -8,7 +9,6 @@ import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.*; -import com.ruoyi.common.core.exception.CustomException; import com.ruoyi.file.config.CephConfig; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -18,6 +18,11 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; +import java.math.BigDecimal; +import java.net.URL; +import java.util.Date; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Consumer; /** * @author dazer @@ -126,12 +131,39 @@ public class CephDfsServiceImpl implements IDfsService { @Override public String objectsCapacityStr() { - throw new CustomException("ceph-获取文件占用空间功能,敬请期待"); + AtomicLong atomicLong = new AtomicLong(); + atomicLong.set(0); + String result; + + amazonS3.listObjects(cephConfig.getBucketName()).getObjectSummaries().forEach(s3ObjectSummary -> { + try { + atomicLong.addAndGet(s3ObjectSummary.getSize() / 1024); + } catch (Exception e) { + e.printStackTrace(); + } + }); + + long size = atomicLong.get(); + if (size > (1024 * 1024)) { + result = (new BigDecimal((double) size / 1024 / 1024)).setScale(2, BigDecimal.ROUND_HALF_UP) + "GB"; + } else if (size > 1024) { + result = (new BigDecimal((double) size / 1024).setScale(2, BigDecimal.ROUND_HALF_UP)) + "MB"; + } else { + result = size + "KB"; + } + + return result; } @Override public String presignedUrl(String fileUrl) { - return fileUrl; + String storePath = getStorePath(fileUrl); + if (cephConfig.getExpiryDuration() == -1) { + return fileUrl; + } + Date expiration = new DateTime(System.currentTimeMillis() + cephConfig.getExpiryDuration()); + URL url = amazonS3.generatePresignedUrl(cephConfig.getBucketName(), storePath, expiration); + return url.toString(); } /**