From a58d058646f4275b73bc539709f0b33e642f04df Mon Sep 17 00:00:00 2001 From: chenchen <934298133@qq.com> Date: Thu, 13 Oct 2022 19:24:36 +0800 Subject: [PATCH] =?UTF-8?q?oss=E6=A1=B6=E6=9D=83=E9=99=90=E4=B8=BA?= =?UTF-8?q?=E7=A7=81=E5=AF=86=E6=97=B6=EF=BC=8C=E5=88=97=E8=A1=A8=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E6=97=B6=E6=A1=B6=E4=B8=BA=E7=A7=81=E5=AF=86=E7=9A=84?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=8E=B7=E5=8F=96=E4=B8=B4=E6=97=B6url?= =?UTF-8?q?=EF=BC=88=E9=9C=80=E6=B7=BB=E5=8A=A0=E5=AD=97=E5=85=B8access=5F?= =?UTF-8?q?policy=EF=BC=8C=E5=85=88=E7=A1=AC=E7=BC=96=E7=A0=81=E4=BA=86?= =?UTF-8?q?=EF=BC=8C=E9=9C=80=E8=A6=81=E5=8F=AF=E6=94=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/oss/constant/OssConstant.java | 5 ++ .../java/com/ruoyi/oss/core/OssClient.java | 51 ++++++++----------- .../ruoyi/oss/properties/OssProperties.java | 5 ++ .../com/ruoyi/system/domain/SysOssConfig.java | 4 ++ .../system/domain/bo/SysOssConfigBo.java | 6 +++ .../system/domain/vo/SysOssConfigVo.java | 5 ++ .../service/impl/SysOssServiceImpl.java | 20 ++++++++ ruoyi-ui/src/views/system/oss/config.vue | 12 ++++- 8 files changed, 78 insertions(+), 30 deletions(-) diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/OssConstant.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/OssConstant.java index ff88c1172..43aa07a45 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/OssConstant.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/OssConstant.java @@ -10,6 +10,11 @@ import java.util.List; */ public interface OssConstant { + /** + * OSS模块KEY + */ + String SYS_OSS_KEY = "sys_oss:"; + /** * 默认配置KEY */ diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java index 15833d3cd..ee815ce7d 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java @@ -2,6 +2,7 @@ package com.ruoyi.oss.core; import cn.hutool.core.util.IdUtil; import com.amazonaws.ClientConfiguration; +import com.amazonaws.HttpMethod; import com.amazonaws.Protocol; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.AWSCredentialsProvider; @@ -10,7 +11,6 @@ import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; @@ -22,6 +22,9 @@ import com.ruoyi.oss.properties.OssProperties; import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.net.URL; +import java.time.Instant; +import java.util.Date; /** * S3 存储协议 所有兼容S3协议的云厂商均支持 @@ -52,16 +55,12 @@ public class OssClient { } else { clientConfig.setProtocol(Protocol.HTTP); } - AmazonS3ClientBuilder build = AmazonS3Client.builder() + this.client = AmazonS3Client.builder() .withEndpointConfiguration(endpointConfig) .withClientConfiguration(clientConfig) .withCredentials(credentialsProvider) - .disableChunkedEncoding(); - if (!StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE)){ - // minio 使用https限制使用域名访问 需要此配置 站点填域名 - build.enablePathStyleAccess(); - } - this.client = build.build(); + .disableChunkedEncoding() + .build(); createBucket(); } catch (Exception e) { @@ -96,10 +95,7 @@ public class OssClient { ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(contentType); metadata.setContentLength(inputStream.available()); - PutObjectRequest putObjectRequest = new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata); - // 设置上传对象的 Acl 为公共读 - putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead); - client.putObject(putObjectRequest); + client.putObject(new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata)); } catch (Exception e) { throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]"); } @@ -123,31 +119,18 @@ public class OssClient { return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); } - /** - * 获取文件元数据 - * - * @param path 完整文件路径 - */ - public ObjectMetadata getObjectMetadata(String path) { - S3Object object = client.getObject(properties.getBucketName(), path); - return object.getObjectMetadata(); - } - public String getUrl() { String domain = properties.getDomain(); + if (StringUtils.isNotBlank(domain)) { + return domain; + } String endpoint = properties.getEndpoint(); String header = OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? "https://" : "http://"; // 云服务商直接返回 - if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)){ - if (StringUtils.isNotBlank(domain)) { - return header + domain; - } + if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)) { return header + properties.getBucketName() + "." + endpoint; } // minio 单独处理 - if (StringUtils.isNotBlank(domain)) { - return header + domain + "/" + properties.getBucketName(); - } return header + endpoint + "/" + properties.getBucketName(); } @@ -167,6 +150,16 @@ public class OssClient { return configKey; } + public String getPrivateUrl(String objectKey, Integer second) { +// objectKey = "file/2022/10/13/81eef51cb0734dedbfa616493a021fe4.jpg"; + GeneratePresignedUrlRequest generatePresignedUrlRequest = + new GeneratePresignedUrlRequest(properties.getBucketName(), objectKey) + .withMethod(HttpMethod.GET) + .withExpiration(new Date(Instant.now().toEpochMilli() + 1000 * second)); + URL url = client.generatePresignedUrl(generatePresignedUrlRequest); + return url.toString(); + } + private static String getPolicy(String bucketName, PolicyType policyType) { StringBuilder builder = new StringBuilder(); builder.append("{\n\"Statement\": [\n{\n\"Action\": [\n"); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/OssProperties.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/OssProperties.java index a01777901..781a17005 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/OssProperties.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/OssProperties.java @@ -50,4 +50,9 @@ public class OssProperties { */ private String isHttps; + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java index 577f17fb8..7f2b05f6a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java @@ -82,4 +82,8 @@ public class SysOssConfig extends BaseEntity { */ private String remark; + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java index e9f481d5e..af289376c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java @@ -98,4 +98,10 @@ public class SysOssConfigBo extends BaseEntity { */ private String remark; + /** + * 桶权限类型(0private 1public 2custom) + */ + @NotBlank(message = "桶权限类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String accessPolicy; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysOssConfigVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysOssConfigVo.java index f8b31d6b5..616e4e82d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysOssConfigVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysOssConfigVo.java @@ -82,4 +82,9 @@ public class SysOssConfigVo { */ private String remark; + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java index 514e68efb..81e4265d1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -8,10 +8,15 @@ import com.ruoyi.common.constant.CacheNames; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; +import com.ruoyi.oss.constant.OssConstant; import com.ruoyi.oss.core.OssClient; import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.factory.OssFactory; +import com.ruoyi.oss.properties.OssProperties; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.bo.SysOssBo; import com.ruoyi.system.domain.vo.SysOssVo; @@ -27,6 +32,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 文件上传 服务层实现 @@ -43,6 +49,20 @@ public class SysOssServiceImpl implements ISysOssService { public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List filterResult = result.getRecords().stream().map(o -> { + Object json = RedisUtils.getCacheObject(OssConstant.SYS_OSS_KEY + o.getService()); + OssProperties properties = JsonUtils.parseObject(json.toString(), OssProperties.class); + if (properties == null) { + throw new OssException("系统异常, '" + o.getService() + "'配置信息不存在!"); + } + String privateFlag = "0"; + if (properties.getAccessPolicy().equals(privateFlag)) { + OssClient storage = OssFactory.instance(o.getService()); + o.setUrl(storage.getPrivateUrl(o.getFileName(), 100)); + } + return o; + }).collect(Collectors.toList()); + result.setRecords(filterResult); return TableDataInfo.build(result); } diff --git a/ruoyi-ui/src/views/system/oss/config.vue b/ruoyi-ui/src/views/system/oss/config.vue index 54ad98cb1..a2f2101d1 100644 --- a/ruoyi-ui/src/views/system/oss/config.vue +++ b/ruoyi-ui/src/views/system/oss/config.vue @@ -151,6 +151,16 @@ >{{dict.label}} + + + + {{dict.label}} + + @@ -179,7 +189,7 @@ import { export default { name: "OssConfig", - dicts: ['sys_yes_no', 'sys_normal_disable'], + dicts: ['sys_yes_no', 'sys_normal_disable','access_policy'], data() { return { // 按钮loading