diff --git a/docker/deploy.sh b/docker/deploy.sh index 3b6e69654..79fb9ae5b 100644 --- a/docker/deploy.sh +++ b/docker/deploy.sh @@ -6,10 +6,17 @@ usage() { exit 1 } -#开启所需端口 +#开启所需端口(生产环境不推荐开启) port(){ + # mysql 端口 firewall-cmd --add-port=3306/tcp --permanent + # redis 端口 firewall-cmd --add-port=6379/tcp --permanent + # minio api 端口 + firewall-cmd --add-port=9000/tcp --permanent + # minio 控制台端口 + firewall-cmd --add-port=9001/tcp --permanent + # 重启防火墙 service firewalld restart } @@ -24,7 +31,7 @@ mount(){ #启动基础模块 base(){ - docker-compose up -d mysql nginx-web redis + docker-compose up -d mysql nginx-web redis minio } #启动基础模块 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 63c46a468..b08c32d28 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -18,6 +18,8 @@ services: - /docker/mysql/data/:/var/lib/mysql/ # 配置挂载 - /docker/mysql/conf/:/etc/mysql/conf.d/ + # 主机本机时间文件映射 与本机时间同步 + - /etc/localtime:/etc/localtime:ro command: # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配) --default-authentication-plugin=mysql_native_password @@ -68,6 +70,8 @@ services: - /docker/redis/conf/redis.conf:/redis.conf:rw # 数据文件 - /docker/redis/data:/data:rw + # 主机本机时间文件映射 与本机时间同步 + - /etc/localtime:/etc/localtime:ro command: "redis-server --appendonly yes" privileged: true restart: always @@ -75,6 +79,33 @@ services: ruoyi_net: ipv4_address: 172.30.0.48 + minio: + image: minio/minio:RELEASE.2021-07-08T01-15-01Z + hostname: "minio" + ports: + # api 端口 + - 9000:9000 + # 控制台端口 + - 9001:9001 + environment: + # 管理后台用户名 + MINIO_ACCESS_KEY: ruoyi + # 管理后台密码,最小8个字符 + MINIO_SECRET_KEY: ruoyi123 + volumes: + # 映射当前目录下的data目录至容器内/data目录 + - /docker/minio/data:/data + # 映射配置目录 + - /docker/minio/config:/root/.minio/ + # 主机本机时间文件映射 与本机时间同步 + - /etc/localtime:/etc/localtime:ro + command: server --console-address ':9001' /data # 指定容器中的目录 /data + privileged: true + restart: always + networks: + ruoyi_net: + ipv4_address: 172.30.0.54 + ruoyi-server1: image: "ruoyi/ruoyi-server:2.5.1" environment: diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/entity/UploadResult.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/entity/UploadResult.java new file mode 100644 index 000000000..6d38882af --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/entity/UploadResult.java @@ -0,0 +1,24 @@ +package com.ruoyi.oss.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 上传返回体 + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class UploadResult { + + /** + * 文件路径 + */ + private String url; + + /** + * 文件名 + */ + private String filename; +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/PolicyType.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/PolicyType.java new file mode 100644 index 000000000..c10dceb06 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/PolicyType.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 庄骞 (smallchill@163.com) + */ +package com.ruoyi.oss.enumd; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * minio策略配置 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum PolicyType { + + /** + * 只读 + */ + READ("read-only"), + + /** + * 只写 + */ + WRITE("write-only"), + + /** + * 读写 + */ + READ_WRITE("read-write"); + + /** + * 类型 + */ + private final String type; + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java index 0bf134f70..50053e88f 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java @@ -69,27 +69,22 @@ public class CloudStorageProperties { public static class MinioProperties { /** - * 七牛绑定的域名 + * minio域名 */ private String endpoint; /** - * 七牛路径前缀 - */ - private String prefix; - - /** - * 七牛ACCESS_KEY + * minio ACCESS_KEY */ private String accessKey; /** - * 七牛SECRET_KEY + * minio SECRET_KEY */ private String secretKey; /** - * 七牛存储空间名 + * minio 存储空间名 */ private String bucketName; @@ -114,6 +109,11 @@ public class CloudStorageProperties { */ private String prefix; + /** + * 腾讯云appId + */ + private String appId; + /** * 腾讯云SecretId */ diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java index a6a29c7c8..700bf3f8a 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java @@ -1,5 +1,7 @@ package com.ruoyi.oss.service; +import com.ruoyi.oss.entity.UploadResult; + import java.io.InputStream; /** @@ -30,7 +32,7 @@ public interface ICloudStorageService { * @param path 文件路径,包含文件名 * @return 返回http地址 */ - String upload(byte[] data, String path); + UploadResult upload(byte[] data, String path); /** * 文件删除 @@ -46,7 +48,7 @@ public interface ICloudStorageService { * @param suffix 后缀 * @return 返回http地址 */ - String uploadSuffix(byte[] data, String suffix); + UploadResult uploadSuffix(byte[] data, String suffix); /** * 文件上传 @@ -55,7 +57,7 @@ public interface ICloudStorageService { * @param path 文件路径,包含文件名 * @return 返回http地址 */ - String upload(InputStream inputStream, String path); + UploadResult upload(InputStream inputStream, String path); /** * 文件上传 @@ -64,5 +66,5 @@ public interface ICloudStorageService { * @param suffix 后缀 * @return 返回http地址 */ - String uploadSuffix(InputStream inputStream, String suffix); + UploadResult uploadSuffix(InputStream inputStream, String suffix); } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java index a154670ef..42f44e1d8 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.service.ICloudStorageService; import org.springframework.beans.factory.InitializingBean; @@ -33,22 +34,22 @@ public abstract class AbstractCloudStorageService implements ICloudStorageServic } @Override - public abstract String upload(byte[] data, String path); + public abstract UploadResult upload(byte[] data, String path); @Override public abstract void delete(String path); @Override - public String upload(InputStream inputStream, String path) { + public UploadResult upload(InputStream inputStream, String path) { byte[] data = IoUtil.readBytes(inputStream); return this.upload(data, path); } @Override - public abstract String uploadSuffix(byte[] data, String suffix); + public abstract UploadResult uploadSuffix(byte[] data, String suffix); @Override - public abstract String uploadSuffix(InputStream inputStream, String suffix); + public abstract UploadResult uploadSuffix(InputStream inputStream, String suffix); @Override public abstract void afterPropertiesSet() throws Exception; diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java index 6a84ddeb1..e6733c958 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java @@ -3,6 +3,7 @@ package com.ruoyi.oss.service.impl; import com.aliyun.oss.ClientConfiguration; import com.aliyun.oss.OSSClient; import com.aliyun.oss.common.auth.DefaultCredentialProvider; +import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.factory.OssFactory; @@ -49,18 +50,18 @@ public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService i } @Override - public String upload(byte[] data, String path) { + public UploadResult upload(byte[] data, String path) { return upload(new ByteArrayInputStream(data), path); } @Override - public String upload(InputStream inputStream, String path) { + public UploadResult upload(InputStream inputStream, String path) { try { client.putObject(this.properties.getBucketName(), path, inputStream); } catch (Exception e) { throw new OssException("上传文件失败,请检查配置信息"); } - return this.properties.getEndpoint() + "/" + path; + return new UploadResult().setUrl(properties.getEndpoint() + "/" + path).setFilename(path); } @Override @@ -74,12 +75,12 @@ public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService i } @Override - public String uploadSuffix(byte[] data, String suffix) { + public UploadResult uploadSuffix(byte[] data, String suffix) { return upload(data, getPath(this.properties.getPrefix(), suffix)); } @Override - public String uploadSuffix(InputStream inputStream, String suffix) { + public UploadResult uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, getPath(this.properties.getPrefix(), suffix)); } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java index bca97df2c..e53c77cd8 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java @@ -1,17 +1,20 @@ package com.ruoyi.oss.service.impl; +import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; +import com.ruoyi.oss.enumd.PolicyType; import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.oss.properties.CloudStorageProperties; import com.ruoyi.oss.properties.CloudStorageProperties.MinioProperties; import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; -import io.minio.MinioClient; +import io.minio.*; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.io.ByteArrayInputStream; import java.io.InputStream; /** @@ -34,6 +37,16 @@ public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService im .endpoint(this.properties.getEndpoint()) .credentials(this.properties.getAccessKey(), this.properties.getSecretKey()) .build(); + String bucketName = this.properties.getBucketName(); + boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + // 不存在就创建桶 + if (!exists) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + minioClient.setBucketPolicy(SetBucketPolicyArgs.builder() + .bucket(bucketName) + .config(getPolicy(bucketName, PolicyType.READ)) + .build()); + } } catch (Exception e) { throw new IllegalArgumentException("Minio存储配置错误! 请检查系统配置!"); } @@ -45,36 +58,125 @@ public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService im } @Override - public String upload(byte[] data, String path) { - try { + public UploadResult upload(byte[] data, String path) { + return upload(new ByteArrayInputStream(data), path); + } + @Override + public UploadResult upload(InputStream inputStream, String path) { + try { + minioClient.putObject(PutObjectArgs.builder() + .bucket(properties.getBucketName()) + .object(path) + .contentType("application/octet-stream") + .stream(inputStream, inputStream.available(), -1) + .build()); } catch (Exception e) { throw new OssException("上传文件失败,请核对Minio配置信息"); } - return this.properties.getEndpoint() + "/" + path; + return new UploadResult().setUrl(getBaseUrl() + path).setFilename(path); } @Override public void delete(String path) { + path = path.replace(getBaseUrl(), ""); try { - + minioClient.removeObject(RemoveObjectArgs.builder() + .bucket(properties.getBucketName()) + .object(path) + .build()); } catch (Exception e) { throw new OssException(e.getMessage()); } } @Override - public String uploadSuffix(byte[] data, String suffix) { - return upload(data, getPath(this.properties.getPrefix(), suffix)); + public UploadResult uploadSuffix(byte[] data, String suffix) { + return upload(data, getPath("", suffix)); } @Override - public String uploadSuffix(InputStream inputStream, String suffix) { - return upload(inputStream, getPath(this.properties.getPrefix(), suffix)); + public UploadResult uploadSuffix(InputStream inputStream, String suffix) { + return upload(inputStream, getPath("", suffix)); } @Override public void afterPropertiesSet() throws Exception { - OssFactory.register(getServiceType(),this); + OssFactory.register(getServiceType(), this); + } + + private String getBaseUrl() { + return properties.getEndpoint() + "/" + properties.getBucketName() + "/"; + } + + private String getPolicy(String bucketName, PolicyType policyType) { + StringBuilder builder = new StringBuilder(); + builder.append("{\n"); + builder.append(" \"Statement\": [\n"); + builder.append(" {\n"); + builder.append(" \"Action\": [\n"); + if (policyType == PolicyType.WRITE) { + builder.append(" \"s3:GetBucketLocation\",\n"); + builder.append(" \"s3:ListBucketMultipartUploads\"\n"); + } else if (policyType == PolicyType.READ_WRITE) { + builder.append(" \"s3:GetBucketLocation\",\n"); + builder.append(" \"s3:ListBucket\",\n"); + builder.append(" \"s3:ListBucketMultipartUploads\"\n"); + } else { + builder.append(" \"s3:GetBucketLocation\"\n"); + } + builder.append(" ],\n"); + builder.append(" \"Effect\": \"Allow\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("\"\n"); + builder.append(" },\n"); + if (PolicyType.READ.equals(policyType)) { + builder.append(" {\n"); + builder.append(" \"Action\": [\n"); + builder.append(" \"s3:ListBucket\"\n"); + builder.append(" ],\n"); + builder.append(" \"Effect\": \"Deny\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("\"\n"); + builder.append(" },\n"); + } + builder.append(" {\n"); + builder.append(" \"Action\": "); + switch (policyType) { + case WRITE: + builder.append("[\n"); + builder.append(" \"s3:AbortMultipartUpload\",\n"); + builder.append(" \"s3:DeleteObject\",\n"); + builder.append(" \"s3:ListMultipartUploadParts\",\n"); + builder.append(" \"s3:PutObject\"\n"); + builder.append(" ],\n"); + break; + case READ_WRITE: + builder.append("[\n"); + builder.append(" \"s3:AbortMultipartUpload\",\n"); + builder.append(" \"s3:DeleteObject\",\n"); + builder.append(" \"s3:GetObject\",\n"); + builder.append(" \"s3:ListMultipartUploadParts\",\n"); + builder.append(" \"s3:PutObject\"\n"); + builder.append(" ],\n"); + break; + default: + builder.append("\"s3:GetObject\",\n"); + break; + } + builder.append(" \"Effect\": \"Allow\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("/*\"\n"); + builder.append(" }\n"); + builder.append(" ],\n"); + builder.append(" \"Version\": \"2012-10-17\"\n"); + builder.append("}\n"); + return builder.toString(); } } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java index 3b367b7d4..883f10e88 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java @@ -5,6 +5,7 @@ import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.region.Region; +import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.oss.properties.CloudStorageProperties; @@ -52,7 +53,7 @@ public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService i } @Override - public String upload(byte[] data, String path) { + public UploadResult upload(byte[] data, String path) { // 腾讯云必需要以"/"开头 if (!path.startsWith("/")) { path = "/" + path; @@ -64,7 +65,7 @@ public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService i // if (Convert.toInt(jsonObject.get("code")) != 0) { // throw new OssException("文件上传失败," + Convert.toStr(jsonObject.get("message"))); // } - return this.properties.getDomain() + path; + return new UploadResult().setUrl(properties.getDomain() + "/" + path).setFilename(path); } @Override @@ -79,12 +80,12 @@ public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService i } @Override - public String uploadSuffix(byte[] data, String suffix) { + public UploadResult uploadSuffix(byte[] data, String suffix) { return upload(data, getPath(this.properties.getPrefix(), suffix)); } @Override - public String uploadSuffix(InputStream inputStream, String suffix) { + public UploadResult uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, getPath(this.properties.getPrefix(), suffix)); } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java index ee4e4abab..91a852eec 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java @@ -6,6 +6,7 @@ import com.qiniu.storage.Configuration; import com.qiniu.storage.Region; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; +import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.factory.OssFactory; @@ -59,7 +60,7 @@ public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService im } @Override - public String upload(byte[] data, String path) { + public UploadResult upload(byte[] data, String path) { try { Response res = uploadManager.put(data, path, token); if (!res.isOK()) { @@ -68,7 +69,7 @@ public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService im } catch (Exception e) { throw new OssException("上传文件失败,请核对七牛配置信息"); } - return this.properties.getDomain() + "/" + path; + return new UploadResult().setUrl(properties.getDomain() + "/" + path).setFilename(path); } @Override @@ -85,12 +86,12 @@ public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService im } @Override - public String uploadSuffix(byte[] data, String suffix) { + public UploadResult uploadSuffix(byte[] data, String suffix) { return upload(data, getPath(this.properties.getPrefix(), suffix)); } @Override - public String uploadSuffix(InputStream inputStream, String suffix) { + public UploadResult uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, getPath(this.properties.getPrefix(), suffix)); } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/bo/SysOssQueryBo.java b/ruoyi-oss/src/main/java/com/ruoyi/system/bo/SysOssQueryBo.java index b96e79063..a5f35c8d9 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/system/bo/SysOssQueryBo.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/bo/SysOssQueryBo.java @@ -43,6 +43,11 @@ public class SysOssQueryBo extends BaseEntity { */ @ApiModelProperty("文件名") private String fileName; + /** + * 原名 + */ + @ApiModelProperty("原名") + private String originalName; /** * 文件后缀名 */ diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java index a99d9736c..7b7639c38 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java @@ -25,7 +25,7 @@ public class SysOss implements Serializable { /** * 云存储主键 */ - @TableId(value = "oss_id") + @TableId(value = "oss_id", type = IdType.AUTO) private Long ossId; /** @@ -33,6 +33,11 @@ public class SysOss implements Serializable { */ private String fileName; + /** + * 原名 + */ + private String originalName; + /** * 文件后缀名 */ diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java index eacd8a018..994458bef 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -8,6 +8,7 @@ import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.oss.service.ICloudStorageService; import com.ruoyi.system.bo.SysOssQueryBo; @@ -41,10 +42,11 @@ public class SysOssServiceImpl extends ServicePlusImpl imp Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.like(StrUtil.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); + lqw.like(StrUtil.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); lqw.eq(StrUtil.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); lqw.eq(StrUtil.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - SysOss::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); lqw.eq(StrUtil.isNotBlank(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); lqw.eq(StrUtil.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); return lqw; @@ -54,24 +56,27 @@ public class SysOssServiceImpl extends ServicePlusImpl imp public SysOss upload(MultipartFile file) { String originalfileName = file.getOriginalFilename(); String suffix = StrUtil.sub(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + ICloudStorageService storage = OssFactory.instance(); + UploadResult uploadResult; try { - ICloudStorageService storage = OssFactory.instance(); - String url = storage.uploadSuffix(file.getBytes(), suffix); - // 保存文件信息 - SysOss oss = new SysOss() - .setUrl(url).setFileSuffix(suffix) - .setFileName(originalfileName) - .setService(storage.getServiceType()); - save(oss); - return oss; + uploadResult = storage.uploadSuffix(file.getBytes(), suffix); } catch (IOException e) { throw new CustomException("文件读取异常!!!", e); } + // 保存文件信息 + SysOss oss = new SysOss() + .setUrl(uploadResult.getUrl()) + .setFileSuffix(suffix) + .setFileName(uploadResult.getFilename()) + .setOriginalName(originalfileName) + .setService(storage.getServiceType()); + save(oss); + return oss; } @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { // 做一些业务上的校验,判断是否需要校验 } List list = listByIds(ids); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/vo/SysOssVo.java b/ruoyi-oss/src/main/java/com/ruoyi/system/vo/SysOssVo.java index 948b954f0..db4f28f7a 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/system/vo/SysOssVo.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/vo/SysOssVo.java @@ -29,6 +29,12 @@ public class SysOssVo { @ApiModelProperty("文件名") private String fileName; + /** + * 原名 + */ + @ApiModelProperty("原名") + private String originalName; + /** * 文件后缀名 */ diff --git a/ruoyi-ui/src/views/system/oss/index.vue b/ruoyi-ui/src/views/system/oss/index.vue index ce888f6a8..0ad14cbc8 100644 --- a/ruoyi-ui/src/views/system/oss/index.vue +++ b/ruoyi-ui/src/views/system/oss/index.vue @@ -10,6 +10,15 @@ @keyup.enter.native="handleQuery" /> + + + + @@ -172,6 +182,7 @@ export default { pageNum: 1, pageSize: 10, fileName: undefined, + originalName: undefined, fileSuffix: undefined, url: undefined, createTime: undefined, @@ -217,6 +228,7 @@ export default { ossId: undefined, file: undefined, fileName: undefined, + originalName: undefined, fileSuffix: undefined, url: undefined, createTime: undefined, diff --git a/sql/oss.sql b/sql/oss.sql index 1b593483f..4e3d8f01c 100644 --- a/sql/oss.sql +++ b/sql/oss.sql @@ -5,12 +5,13 @@ drop table if exists sys_oss; create table sys_oss ( oss_id bigint(20) not null auto_increment comment '云存储主键', file_name varchar(64) not null default '' comment '文件名', + original_name varchar(64) not null default '' comment '原名', file_suffix varchar(10) not null default '' comment '文件后缀名', url varchar(200) not null comment 'URL地址', create_time datetime default null comment '创建时间', - create_by varchar(64) not null default '' comment '上传人', + create_by varchar(64) default '' comment '上传人', update_time datetime default null comment '更新时间', - update_by varchar(64) not null default '' comment '更新人', + update_by varchar(64) default '' comment '更新人', service varchar(10) not null default 'minio' comment '服务商', primary key (oss_id) ) engine=innodb comment ='OSS云存储表';