疯狂的狮子li
2021-07-18 089e288a6e55d2ae527ad733bbb8b8b5eaad6107
update 使用 策略+工厂 重写OSS模块
已修改14个文件
已添加8个文件
已删除4个文件
1076 ■■■■■ 文件已修改
ruoyi-oss/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/config/CloudStorageConfig.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/AliyunProperties.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/MinioProperties.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/QcloudProperties.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/QiniuProperties.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/oss/utils/DateUtils.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/system/factory/OSSFactory.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/src/main/resources/sql/oss.sql 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/oss.sql 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oss/pom.xml
@@ -22,6 +22,10 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
        </dependency>
        <dependency>
            <groupId>com.qiniu</groupId>
ruoyi-oss/src/main/java/com/ruoyi/oss/config/CloudStorageConfig.java
ÎļþÒÑɾ³ý
ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java
@@ -1,43 +1,16 @@
package com.ruoyi.oss.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * äº‘存储常量
 *
 * @author Lion Li
 */
public class CloudConstant {
    /**
     * äº‘存储配置KEY
     */
    public final static String CLOUD_STORAGE_CONFIG_KEY = "sys.oss.cloud-storage";
    public final static String CLOUD_STORAGE_CONFIG_KEY = "sys.oss.cloudStorageService";
    /**
     * äº‘服务商
     */
    @Getter
    @AllArgsConstructor
    public enum CloudService {
        /**
         * ä¸ƒç‰›äº‘
         */
        QINIU(1),
        /**
         * é˜¿é‡Œäº‘
         */
        ALIYUN(2),
        /**
         * è…¾è®¯äº‘
         */
        QCLOUD(3),
        /**
         * minio
         */
        MINIO(4);
        private final int value;
    }
}
ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.oss.enumd;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * äº‘存储服务商枚举
 *
 * @author LionLi
 */
@Getter
@AllArgsConstructor
public enum CloudServiceEnumd {
    /**
     * ä¸ƒç‰›äº‘
     */
    QINIU("qiniu"),
    /**
     * é˜¿é‡Œäº‘
     */
    ALIYUN("aliyun"),
    /**
     * è…¾è®¯äº‘
     */
    QCLOUD("qcloud"),
    /**
     * minio
     */
    MINIO("minio");
    private final String value;
}
ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.oss.factory;
import cn.hutool.core.lang.Assert;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.oss.constant.CloudConstant;
import com.ruoyi.oss.service.ICloudStorageService;
import com.ruoyi.system.service.ISysConfigService;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * æ–‡ä»¶ä¸Šä¼ Factory
 *
 * @author Lion Li
 */
public class OssFactory {
    private static ISysConfigService sysConfigService;
    static {
        OssFactory.sysConfigService = SpringUtils.getBean(ISysConfigService.class);
    }
    private static final Map<String, ICloudStorageService> SERVICES = new ConcurrentHashMap<>();
    public static ICloudStorageService instance() {
        String type = sysConfigService.selectConfigByKey(CloudConstant.CLOUD_STORAGE_CONFIG_KEY);
        return SERVICES.get(type);
    }
    public static ICloudStorageService instance(String type) {
        return SERVICES.get(type);
    }
    public static void register(String type, ICloudStorageService iCloudStorageService) {
        Assert.notNull(type, "type can't be null");
        SERVICES.put(type, iCloudStorageService);
    }
}
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/AliyunProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.oss.properties;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * é˜¿é‡Œäº‘ é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@NoArgsConstructor
public class AliyunProperties {
    /**
     * é˜¿é‡Œäº‘绑定的域名
     */
    private String endpoint;
    /**
     * é˜¿é‡Œäº‘路径前缀
     */
    private String prefix;
    /**
     * é˜¿é‡Œäº‘AccessKeyId
     */
    private String accessKeyId;
    /**
     * é˜¿é‡Œäº‘AccessKeySecret
     */
    private String accessKeySecret;
    /**
     * é˜¿é‡Œäº‘BucketName
     */
    private String bucketName;
}
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.oss.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * OSS云存储 é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@Component
@ConfigurationProperties(prefix = "cloud-storage")
public class CloudStorageProperties {
    private QiniuProperties qiniu;
    private AliyunProperties aliyun;
    private QcloudProperties qcloud;
    private MinioProperties minio;
}
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/MinioProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.oss.properties;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * Minio é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@NoArgsConstructor
public class MinioProperties {
    /**
     * ä¸ƒç‰›ç»‘定的域名
     */
    private String endpoint;
    /**
     * ä¸ƒç‰›è·¯å¾„前缀
     */
    private String prefix;
    /**
     * ä¸ƒç‰›ACCESS_KEY
     */
    private String accessKey;
    /**
     * ä¸ƒç‰›SECRET_KEY
     */
    private String secretKey;
    /**
     * ä¸ƒç‰›å­˜å‚¨ç©ºé—´å
     */
    private String bucketName;
}
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/QcloudProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.ruoyi.oss.properties;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * è…¾è®¯äº‘COS é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@NoArgsConstructor
public class QcloudProperties {
    /**
     * è…¾è®¯äº‘绑定的域名
     */
    private String domain;
    /**
     * è…¾è®¯äº‘路径前缀
     */
    private String prefix;
    /**
     * è…¾è®¯äº‘SecretId
     */
    private String secretId;
    /**
     * è…¾è®¯äº‘SecretKey
     */
    private String secretKey;
    /**
     * è…¾è®¯äº‘BucketName
     */
    private String bucketName;
    /**
     * è…¾è®¯äº‘COS所属地区
     */
    private String region;
}
ruoyi-oss/src/main/java/com/ruoyi/oss/properties/QiniuProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.oss.properties;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * ä¸ƒç‰›äº‘ é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@NoArgsConstructor
public class QiniuProperties {
    /**
     * ä¸ƒç‰›ç»‘定的域名
     */
    private String domain;
    /**
     * ä¸ƒç‰›è·¯å¾„前缀
     */
    private String prefix;
    /**
     * ä¸ƒç‰›ACCESS_KEY
     */
    private String accessKey;
    /**
     * ä¸ƒç‰›SECRET_KEY
     */
    private String secretKey;
    /**
     * ä¸ƒç‰›å­˜å‚¨ç©ºé—´å
     */
    private String bucketName;
}
ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java
@@ -2,9 +2,19 @@
import java.io.InputStream;
/**
 * äº‘存储服务接口
 *
 * @author Lion Li
 */
public interface ICloudStorageService {
    /**
     * èŽ·å–æœåŠ¡å•†ç±»åž‹
     */
    String getServiceType();
    /**
     * æ–‡ä»¶è·¯å¾„
     *
     * @param prefix å‰ç¼€
ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java
@@ -1,36 +1,55 @@
package com.ruoyi.oss.service.abstractd;
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.config.CloudStorageConfig;
import com.ruoyi.oss.service.ICloudStorageService;
import com.ruoyi.oss.utils.DateUtils;
import org.springframework.beans.factory.InitializingBean;
import java.util.UUID;
import java.io.InputStream;
import java.util.Date;
/**
 * äº‘存储(支持七牛、阿里云、腾讯云、minio)
 *
 * @author Lion Li
 */
public abstract class AbstractCloudStorageService implements ICloudStorageService {
public abstract class AbstractCloudStorageService implements ICloudStorageService, InitializingBean {
    /**
     * äº‘存储配置信息
     */
    protected CloudStorageConfig config;
    public int getServiceType() {
        return config.getType();
    }
    @Override
    public abstract String getServiceType();
    @Override
    public String getPath(String prefix, String suffix) {
        // ç”Ÿæˆuuid
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String uuid = IdUtil.fastSimpleUUID();
        // æ–‡ä»¶è·¯å¾„
        String path = DateUtils.dateTime() + "/" + uuid;
        String path = DateUtil.format(new Date(), "yyyyMMdd") + "/" + uuid;
        if (StrUtil.isNotBlank(prefix)) {
            path = prefix + "/" + path;
        }
        return path + suffix;
    }
    @Override
    public abstract String upload(byte[] data, String path);
    @Override
    public abstract void delete(String path);
    @Override
    public String upload(InputStream inputStream, String path) {
        byte[] data = IoUtil.readBytes(inputStream);
        return this.upload(data, path);
    }
    @Override
    public abstract String uploadSuffix(byte[] data, String suffix);
    @Override
    public abstract String uploadSuffix(InputStream inputStream, String suffix);
    @Override
    public abstract void afterPropertiesSet() throws Exception;
}
ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java
@@ -1,28 +1,47 @@
package com.ruoyi.oss.service.impl;
import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.ruoyi.oss.config.CloudStorageConfig;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.ruoyi.oss.enumd.CloudServiceEnumd;
import com.ruoyi.oss.exception.OssException;
import com.ruoyi.oss.factory.OssFactory;
import com.ruoyi.oss.properties.AliyunProperties;
import com.ruoyi.oss.properties.CloudStorageProperties;
import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService;
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;
/**
 * é˜¿é‡Œäº‘存储
 *
 * @author Lion Li
 */
public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService {
@Lazy
@Service
public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean {
    private OSSClient client;
    private final OSSClient client;
    private final AliyunProperties properties;
    public AliyunCloudStorageServiceImpl(CloudStorageConfig config) {
        this.config = config;
        // åˆå§‹åŒ–
        init();
    @Autowired
    public AliyunCloudStorageServiceImpl(CloudStorageProperties properties) {
        this.properties = properties.getAliyun();
        ClientConfiguration configuration = new ClientConfiguration();
        DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider(
            this.properties.getAccessKeyId(),
            this.properties.getAccessKeySecret());
        client = new OSSClient(this.properties.getEndpoint(), credentialProvider, configuration);
    }
    private void init() {
        client = new OSSClient(config.getDomain(), config.getAccessKey(), config.getSecretKey());
    @Override
    public String getServiceType() {
        return CloudServiceEnumd.ALIYUN.getValue();
    }
    @Override
@@ -33,18 +52,18 @@
    @Override
    public String upload(InputStream inputStream, String path) {
        try {
            client.putObject(config.getBucketName(), path, inputStream);
            client.putObject(this.properties.getBucketName(), path, inputStream);
        } catch (Exception e) {
            throw new OssException("上传文件失败,请检查配置信息");
        }
        return config.getDomain() + "/" + path;
        return this.properties.getEndpoint() + "/" + path;
    }
    @Override
    public void delete(String path) {
        path = path.replace(config.getDomain() + "/", "");
        path = path.replace(this.properties.getEndpoint() + "/", "");
        try {
            client.deleteObject(config.getBucketName(), path);
            client.deleteObject(this.properties.getBucketName(), path);
        } catch (Exception e) {
            throw new OssException("上传文件失败,请检查配置信息");
        }
@@ -52,11 +71,16 @@
    @Override
    public String uploadSuffix(byte[] data, String suffix) {
        return upload(data, getPath(config.getPrefix(), suffix));
        return upload(data, getPath(this.properties.getPrefix(), suffix));
    }
    @Override
    public String uploadSuffix(InputStream inputStream, String suffix) {
        return upload(inputStream, getPath(config.getPrefix(), suffix));
        return upload(inputStream, getPath(this.properties.getPrefix(), suffix));
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        OssFactory.register(getServiceType(),this);
    }
}
ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java
@@ -1,31 +1,43 @@
package com.ruoyi.oss.service.impl;
import cn.hutool.core.io.IoUtil;
import com.ruoyi.oss.config.CloudStorageConfig;
import com.ruoyi.oss.enumd.CloudServiceEnumd;
import com.ruoyi.oss.exception.OssException;
import com.ruoyi.oss.factory.OssFactory;
import com.ruoyi.oss.properties.CloudStorageProperties;
import com.ruoyi.oss.properties.MinioProperties;
import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService;
import io.minio.MinioClient;
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.InputStream;
/**
 * minio存储
 *
 * @author Lion Li
 */
public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService {
@Lazy
@Service
public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean {
    private MinioClient minioClient;
    private final MinioClient minioClient;
    private final MinioProperties properties;
    public MinioCloudStorageServiceImpl(CloudStorageConfig config) {
        this.config = config;
        // åˆå§‹åŒ–
        init();
    @Autowired
    public MinioCloudStorageServiceImpl(CloudStorageProperties properties) {
        this.properties = properties.getMinio();
        minioClient = MinioClient.builder()
            .endpoint(this.properties.getEndpoint())
            .credentials(this.properties.getAccessKey(), this.properties.getSecretKey())
            .build();
    }
    private void init() {
        minioClient = MinioClient.builder()
            .endpoint(config.getDomain())
            .credentials(config.getAccessKey(), config.getSecretKey())
            .build();
    @Override
    public String getServiceType() {
        return CloudServiceEnumd.MINIO.getValue();
    }
    @Override
@@ -35,7 +47,7 @@
        } catch (Exception e) {
            throw new OssException("上传文件失败,请核对Minio配置信息");
        }
        return config.getDomain() + "/" + path;
        return this.properties.getEndpoint() + "/" + path;
    }
    @Override
@@ -48,19 +60,17 @@
    }
    @Override
    public String upload(InputStream inputStream, String path) {
        byte[] data = IoUtil.readBytes(inputStream);
        return this.upload(data, path);
    }
    @Override
    public String uploadSuffix(byte[] data, String suffix) {
        return upload(data, getPath(config.getPrefix(), suffix));
        return upload(data, getPath(this.properties.getPrefix(), suffix));
    }
    @Override
    public String uploadSuffix(InputStream inputStream, String suffix) {
        return upload(inputStream, getPath(config.getPrefix(), suffix));
        return upload(inputStream, getPath(this.properties.getPrefix(), suffix));
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        OssFactory.register(getServiceType(),this);
    }
}
ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java
@@ -1,33 +1,50 @@
package com.ruoyi.oss.service.impl;
import cn.hutool.core.io.IoUtil;
import com.qcloud.cos.COSClient;
import com.ruoyi.oss.config.CloudStorageConfig;
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.enumd.CloudServiceEnumd;
import com.ruoyi.oss.factory.OssFactory;
import com.ruoyi.oss.properties.CloudStorageProperties;
import com.ruoyi.oss.properties.QcloudProperties;
import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService;
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.InputStream;
/**
 * è…¾è®¯äº‘存储
 *
 * @author Lion Li
 */
public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService {
@Lazy
@Service
public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean {
    private COSClient client;
    private final COSClient client;
    private final QcloudProperties properties;
    public QcloudCloudStorageServiceImpl(CloudStorageConfig config) {
        this.config = config;
        // åˆå§‹åŒ–
        init();
    @Autowired
    public QcloudCloudStorageServiceImpl(CloudStorageProperties properties) {
        this.properties = properties.getQcloud();
        COSCredentials credentials = new BasicCOSCredentials(
            this.properties.getSecretId(),
            this.properties.getSecretKey());
        // åˆå§‹åŒ–客户端配置
        ClientConfig clientConfig = new ClientConfig();
        // è®¾ç½®bucket所在的区域,华南:gz åŽåŒ—:tj åŽä¸œï¼šsh
        clientConfig.setRegion(new Region(this.properties.getRegion()));
        client = new COSClient(credentials, clientConfig);
    }
    private void init() {
//        Credentials credentials = new Credentials(config.getQcloudAppId(), config.getQcloudSecretId(),
//                config.getQcloudSecretKey());
//         åˆå§‹åŒ–客户端配置
//        ClientConfig clientConfig = new ClientConfig();
//        // è®¾ç½®bucket所在的区域,华南:gz åŽåŒ—:tj åŽä¸œï¼šsh
//        clientConfig.setRegion(config.getQcloudRegion());
//        client = new COSClient(clientConfig, credentials);
    @Override
    public String getServiceType() {
        return CloudServiceEnumd.QCLOUD.getValue();
    }
    @Override
@@ -43,7 +60,7 @@
//        if (Convert.toInt(jsonObject.get("code")) != 0) {
//            throw new OssException("文件上传失败," + Convert.toStr(jsonObject.get("message")));
//        }
        return config.getDomain() + path;
        return this.properties.getDomain() + path;
    }
    @Override
@@ -57,21 +74,18 @@
//        }
    }
    @Override
    public String upload(InputStream inputStream, String path) {
        byte[] data = IoUtil.readBytes(inputStream);
        return this.upload(data, path);
    }
    @Override
    public String uploadSuffix(byte[] data, String suffix) {
        return upload(data, getPath(config.getPrefix(), suffix));
        return upload(data, getPath(this.properties.getPrefix(), suffix));
    }
    @Override
    public String uploadSuffix(InputStream inputStream, String suffix) {
        return upload(inputStream, getPath(config.getPrefix(), suffix));
        return upload(inputStream, getPath(this.properties.getPrefix(), suffix));
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        OssFactory.register(getServiceType(),this);
    }
}
ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java
@@ -1,42 +1,57 @@
package com.ruoyi.oss.service.impl;
import cn.hutool.core.io.IoUtil;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.ruoyi.oss.config.CloudStorageConfig;
import com.ruoyi.oss.enumd.CloudServiceEnumd;
import com.ruoyi.oss.exception.OssException;
import com.ruoyi.oss.factory.OssFactory;
import com.ruoyi.oss.properties.CloudStorageProperties;
import com.ruoyi.oss.properties.QiniuProperties;
import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService;
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.InputStream;
/**
 * ä¸ƒç‰›äº‘存储
 *
 * @author Lion Li
 */
public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService {
@Lazy
@Service
public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean {
    private UploadManager uploadManager;
    private BucketManager bucketManager;
    private String token;
    private final UploadManager uploadManager;
    private final BucketManager bucketManager;
    private final String token;
    private final QiniuProperties properties;
    public QiniuCloudStorageServiceImpl(CloudStorageConfig config) {
        this.config = config;
        // åˆå§‹åŒ–
        init();
    }
    private void init() {
    @Autowired
    public QiniuCloudStorageServiceImpl(CloudStorageProperties properties) {
        this.properties = properties.getQiniu();
        // z0 z1 z2
        Configuration config = new Configuration(Region.autoRegion());
        // é»˜è®¤ä¸ä½¿ç”¨https
        config.useHttpsDomains = false;
        uploadManager = new UploadManager(config);
        Auth auth = Auth.create(this.config.getAccessKey(), this.config.getSecretKey());
        token = auth.uploadToken(this.config.getBucketName());
        Auth auth = Auth.create(
            this.properties.getAccessKey(),
            this.properties.getSecretKey());
        token = auth.uploadToken(this.properties.getBucketName());
        bucketManager = new BucketManager(auth, config);
    }
    @Override
    public String getServiceType() {
        return CloudServiceEnumd.QINIU.getValue();
    }
    @Override
@@ -49,14 +64,14 @@
        } catch (Exception e) {
            throw new OssException("上传文件失败,请核对七牛配置信息");
        }
        return config.getDomain() + "/" + path;
        return this.properties.getDomain() + "/" + path;
    }
    @Override
    public void delete(String path) {
        try {
            path = path.replace(config.getDomain() + "/", "");
            Response res = bucketManager.delete(config.getBucketName(), path);
            path = path.replace(this.properties.getDomain() + "/", "");
            Response res = bucketManager.delete(this.properties.getBucketName(), path);
            if (!res.isOK()) {
                throw new RuntimeException("删除七牛文件出错:" + res.toString());
            }
@@ -66,19 +81,18 @@
    }
    @Override
    public String upload(InputStream inputStream, String path) {
        byte[] data = IoUtil.readBytes(inputStream);
        return this.upload(data, path);
    }
    @Override
    public String uploadSuffix(byte[] data, String suffix) {
        return upload(data, getPath(config.getPrefix(), suffix));
        return upload(data, getPath(this.properties.getPrefix(), suffix));
    }
    @Override
    public String uploadSuffix(InputStream inputStream, String suffix) {
        return upload(inputStream, getPath(config.getPrefix(), suffix));
        return upload(inputStream, getPath(this.properties.getPrefix(), suffix));
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        OssFactory.register(getServiceType(),this);
    }
}
ruoyi-oss/src/main/java/com/ruoyi/oss/utils/DateUtils.java
ÎļþÒÑɾ³ý
ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java
@@ -1,58 +1,74 @@
package com.ruoyi.system.controller;
import com.aliyun.oss.ServiceException;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysOss;
import com.ruoyi.system.service.ISysOssService;
import lombok.extern.slf4j.Slf4j;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import javax.validation.constraints.NotEmpty;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
 * æ–‡ä»¶ä¸Šä¼  æŽ§åˆ¶å±‚
 *
 * @author chkj
 * @date 2019-07-15
 * @author Lion Li
 */
@Slf4j
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@RestController
@RequestMapping("/system/oss")
public class SysOssController extends BaseController {
    @Autowired
    private ISysOssService iSysOssService;
    private final ISysOssService iSysOssService;
    /**
     * æŸ¥è¯¢æ–‡ä»¶ä¸Šä¼ åˆ—表
     */
    @PreAuthorize("@ss.hasPermi('system:oss:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysOss sysOss) {
        List<SysOss> list = iSysOssService.list(sysOss);
        return PageUtils.buildDataInfo(list);
    public TableDataInfo<SysOss> list(SysOss sysOss) {
        return iSysOssService.queryPageList(sysOss);
    }
    /**
     * ä¸Šä¼ å›¾ç‰‡
     */
    @PreAuthorize("@ss.hasPermi('system:oss:upload')")
    @Log(title = "OSS云存储", businessType = BusinessType.INSERT)
    @RepeatSubmit
    @PostMapping("/upload")
    public AjaxResult upload(@RequestParam("file") MultipartFile file) {
    public AjaxResult<Map<String, String>> upload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            throw new CustomException("上传文件不能为空");
        }
        Map<String, String> json = iSysOssService.upload(file);
        return AjaxResult.success(json);
        SysOss oss = iSysOssService.upload(file);
        Map<String, String> map = new HashMap<>(2);
        map.put("url", oss.getUrl());
        map.put("fileName", oss.getFileName());
        return AjaxResult.success(map);
    }
    /**
     * åˆ é™¤OSS云存储
     */
    @PreAuthorize("@ss.hasPermi('system:oss:remove')")
    @Log(title = "OSS云存储" , businessType = BusinessType.DELETE)
    @DeleteMapping("/{ossIds}")
    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
                                   @PathVariable Long[] ossIds) {
        return toAjax(iSysOssService.deleteByIds(Arrays.asList(ossIds)) ? 1 : 0);
    }
}
ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java
@@ -9,20 +9,24 @@
import java.util.Date;
/**
 * æ–‡ä»¶ä¸Šä¼ è¡¨ sys_oss
 * OSS云存储对象
 *
 * @author chkj
 * @date 2019-07-15
 * @author Lion Li
 */
@Data
@Accessors(chain = true)
@NoArgsConstructor
@Accessors(chain = true)
@TableName("sys_oss")
public class SysOss implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * äº‘存储主键
     */
    @TableId(value = "oss_id")
    private Long ossId;
    /**
     * æ–‡ä»¶å
@@ -52,7 +56,20 @@
    private String createBy;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
    /**
     * æœåС商
     */
    private Integer service;
    private String service;
}
ruoyi-oss/src/main/java/com/ruoyi/system/factory/OSSFactory.java
ÎļþÒÑɾ³ý
ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java
@@ -6,8 +6,7 @@
/**
 * æ–‡ä»¶ä¸Šä¼  æ•°æ®å±‚
 *
 * @author chkj
 * @date 2019-07-15
 * @author Lion Li
 */
public interface SysOssMapper extends BaseMapper<SysOss> {
}
ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java
@@ -1,24 +1,22 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.domain.SysOss;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
 * æ–‡ä»¶ä¸Šä¼  æœåС层
 *
 * @author chkj
 * @date 2019-07-15
 * @author Lion Li
 */
public interface ISysOssService extends IService<SysOss> {
    /**
     * åˆ—表查询
     */
    List<SysOss> list(SysOss sysOss);
    Map<String, String> upload(MultipartFile file);
    TableDataInfo<SysOss> queryPageList(SysOss sysOss);
    SysOss upload(MultipartFile file);
    Boolean deleteByIds(Collection<Long> ids);
}
ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java
@@ -1,63 +1,71 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.oss.config.CloudStorageConfig;
import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.oss.factory.OssFactory;
import com.ruoyi.oss.service.ICloudStorageService;
import com.ruoyi.system.domain.SysOss;
import com.ruoyi.system.factory.OSSFactory;
import com.ruoyi.system.mapper.SysOssMapper;
import com.ruoyi.system.service.ISysOssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.HashMap;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
 * æ–‡ä»¶ä¸Šä¼  æœåŠ¡å±‚å®žçŽ°
 *
 * @author chkj
 * @date 2019-07-15
 * @author Lion Li
 */
@Slf4j
@Service
public class SysOssServiceImpl extends ServiceImpl<SysOssMapper, SysOss> implements ISysOssService {
    @Autowired
    private CloudStorageConfig config;
    @Override
    public List<SysOss> list(SysOss sysOss) {
        LambdaQueryWrapper<SysOss> wrapper = new LambdaQueryWrapper<>();
        return baseMapper.selectList(wrapper);
    public TableDataInfo<SysOss> queryPageList(SysOss sysOss) {
        LambdaQueryWrapper<SysOss> lqw = Wrappers.lambdaQuery();
        lqw.like(StrUtil.isNotBlank(sysOss.getFileName()), SysOss::getFileName, sysOss.getFileName());
        lqw.like(StrUtil.isNotBlank(sysOss.getFileSuffix()), SysOss::getFileSuffix, sysOss.getFileSuffix());
        lqw.like(StrUtil.isNotBlank(sysOss.getUrl()), SysOss::getUrl, sysOss.getUrl());
        lqw.like(StrUtil.isNotBlank(sysOss.getService()), SysOss::getService, sysOss.getService());
        return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw));
    }
    @Override
    public Map<String, String> upload(MultipartFile file) {
    public SysOss upload(MultipartFile file) {
        String originalfileName = file.getOriginalFilename();
        String suffix = originalfileName.substring(originalfileName.lastIndexOf("."));
        String suffix = StrUtil.sub(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
        try {
            AbstractCloudStorageService storage = OSSFactory.build();
            ICloudStorageService storage = OssFactory.instance();
            String url = storage.uploadSuffix(file.getBytes(), suffix);
            // ä¿å­˜æ–‡ä»¶ä¿¡æ¯
            SysOss ossEntity = new SysOss()
            SysOss oss = new SysOss()
                .setUrl(url).setFileSuffix(suffix)
                .setFileName(originalfileName)
                .setService(storage.getServiceType());
            save(ossEntity);
            Map<String, String> map = new HashMap<>(2);
            map.put("url", ossEntity.getUrl());
            map.put("fileName", ossEntity.getFileName());
            return map;
            save(oss);
            return oss;
        } catch (IOException e) {
            throw new CustomException("文件读取异常!!!", e);
        }
    }
    @Override
    public Boolean deleteByIds(Collection<Long> ids) {
        List<SysOss> list = listByIds(ids);
        for (SysOss sysOss : list) {
            ICloudStorageService storage = OssFactory.instance(sysOss.getService());
            storage.delete(sysOss.getUrl());
        }
        return removeByIds(ids);
    }
}
ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml
@@ -1,21 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chkj.cloudStorage.mapper.SysOssMapper">
<mapper namespace="com.ruoyi.system.mapper.SysOssMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.chkj.cloudStorage.domain.SysOss">
        <id column="id" property="id"/>
        <result column="file_name" property="fileName"/>
        <result column="file_suffix" property="fileSuffix"/>
        <result column="url" property="url"/>
        <result column="create_time" property="createTime"/>
        <result column="create_by" property="createBy"/>
        <result column="service" property="service"/>
    <resultMap type="com.ruoyi.system.domain.SysOss" id="SysOssResult">
        <result property="ossId" column="oss_id"/>
        <result property="fileName" column="file_name"/>
        <result property="fileSuffix" column="file_suffix"/>
        <result property="url" column="url"/>
        <result property="createTime" column="create_time"/>
        <result property="createBy" column="create_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="service" column="service"/>
    </resultMap>
    <!-- é€šç”¨æŸ¥è¯¢ç»“果列 -->
    <sql id="Base_Column_List">
        id, file_name, file_suffix, url, create_time, create_by, service
    </sql>
</mapper>
ruoyi-oss/src/main/resources/sql/oss.sql
ÎļþÒÑɾ³ý
sql/oss.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
-- ----------------------------
-- OSS云存储表
-- ----------------------------
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 '文件名',
    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 '上传人',
    update_time     datetime              default null      comment '更新时间',
    update_by       varchar(64)  not null default ''        comment '更新人',
    service         varchar(10)  not null default 'minio'   comment '服务商',
    primary key (oss_id)
) engine=innodb comment ='OSS云存储表';
insert into sys_config values(10, 'OSS云存储服务商',       'sys.oss.cloudStorageService',      'minio',          'Y', 'admin', sysdate(), '', null, 'OSS云存储服务商(qiniu:七牛云, aliyun:阿里云, qcloud:腾讯云, minio: Minio)');
insert into sys_menu values('118',  '文件管理', '1',   '10', 'oss',     'system/oss/index',      1, 0, 'C', '0', '0', 'system:oss:list',      'oss',       'admin', sysdate(), '', null, '文件管理菜单');
insert into sys_menu values('1600', '文件查询', '118', '1', '#', '', 1, 0, 'F', '0', '0', 'system:oss:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1601', '文件上传', '118', '2', '#', '', 1, 0, 'F', '0', '0', 'system:oss:upload',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1602', '文件删除', '118', '3', '#', '', 1, 0, 'F', '0', '0', 'system:oss:remove',       '#', 'admin', sysdate(), '', null, '');