diff --git a/newadmin/oss-service/pom.xml b/newadmin/oss-service/pom.xml new file mode 100644 index 0000000..cc21a1e --- /dev/null +++ b/newadmin/oss-service/pom.xml @@ -0,0 +1,69 @@ + + + + com.chaozhanggui.system + admin-system + 1.0.0 + + 4.0.0 + + oss-service + jar + + + 7.2.27 + 2.8.3 + 3.2.2 + 5.4.4 + + + + + + + com.chaozhanggui.system + common-api + 1.0.0 + + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.oss.version} + + + + com.qiniu + qiniu-java-sdk + ${qiniu.version} + + + + com.qcloud + cos_api + ${qcloud.cos.version} + + + org.slf4j + slf4j-log4j12 + + + + + + com.huaweicloud + esdk-obs-java-bundle + 3.22.3 + + + + org.apache.commons + commons-lang3 + 3.8.1 + + + + + \ No newline at end of file diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/OssServiceConfig.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/OssServiceConfig.java new file mode 100644 index 0000000..e4880e5 --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/OssServiceConfig.java @@ -0,0 +1,12 @@ +package com.dianguang.cloud.ossservice; + + +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EntityScan(basePackageClasses = OssServiceConfig.class) +@ComponentScan(basePackageClasses = OssServiceConfig.class) +public class OssServiceConfig { +} diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/config/CloudStorageConfig.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/config/CloudStorageConfig.java new file mode 100644 index 0000000..68d06db --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/config/CloudStorageConfig.java @@ -0,0 +1,59 @@ +package com.dianguang.cloud.ossservice.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.io.Serializable; + +@Configuration +@ConfigurationProperties(prefix = "cloudstorage") +@Data +public class CloudStorageConfig implements Serializable { + + /** + * 类型 1:七牛 2:阿里 3 :腾讯云 4: fastDfs 5:本地上传 6:minio + */ + private Integer type; + + /** + * 域名 + */ + private String url; + + /** + * 路径前缀 + */ + private String prefix; + + /** + * access_key + */ + private String accessKey; + + /** + * secret_key + */ + private String secretKey; + + /** + * 存储空间命 + */ + private String bucketName; + + /** + * 阿里 + */ + private String endPoint; + + + /** + * qc + */ + private String qcloudRegion; + + /** + * qc + */ + private String qcloudAppId; +} diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/model/Constant.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/model/Constant.java new file mode 100644 index 0000000..9f1eb03 --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/model/Constant.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.dianguang.cloud.ossservice.model; + +/** + * 常量 + * + * @author Mark sunlightcs@gmail.com + */ +public interface Constant { + /** + * 云服务商 + */ + enum CloudService { + /** + * 七牛云 + */ + QINIU(1), + /** + * 阿里云 + */ + ALIYUN(2), + /** + * 腾讯云 + */ + QCLOUD(3), + /** + * 华为云 + */ + HUAWEI(4); + + private int value; + + CloudService(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } +} \ No newline at end of file diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/AbstractCloudStorageService.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/AbstractCloudStorageService.java new file mode 100644 index 0000000..85e5047 --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/AbstractCloudStorageService.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.dianguang.cloud.ossservice.service; + +import com.chaozhanggui.common.system.util.DateUtils; +import com.dianguang.cloud.ossservice.config.CloudStorageConfig; +import org.apache.commons.lang3.StringUtils; + +import java.io.InputStream; +import java.util.UUID; + +/** + * 云存储(支持七牛、阿里云、腾讯云) + * + * @author Mark sunlightcs@gmail.com + */ +public abstract class AbstractCloudStorageService { + /** 云存储配置信息 */ + CloudStorageConfig config; + + /** + * 文件路径 + * @param prefix 前缀 + * @param suffix 后缀 + * @return 返回上传路径 + */ + public String getPath(String prefix, String suffix) { + //生成uuid + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + //文件路径 + String path = DateUtils.getDays() + "/" + uuid; + + if(StringUtils.isNotBlank(prefix)){ + path = prefix + "/" + path; + } + + return path + "." + suffix; + } + + /** + * 文件上传 + * @param data 文件字节数组 + * @param path 文件路径,包含文件名 + * @return 返回http地址 + */ + public abstract String upload(byte[] data, String path) throws Exception; + + /** + * 文件上传 + * @param data 文件字节数组 + * @param suffix 后缀 + * @return 返回http地址 + */ + public abstract String uploadSuffix(byte[] data, String suffix) throws Exception; + + /** + * 文件上传 + * @param inputStream 字节流 + * @param path 文件路径,包含文件名 + * @return 返回http地址 + */ + public abstract String upload(InputStream inputStream, String path) throws Exception; + + /** + * 文件上传 + * @param inputStream 字节流 + * @param suffix 后缀 + * @return 返回http地址 + */ + public abstract String uploadSuffix(InputStream inputStream, String suffix) throws Exception; + +} diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/AliyunCloudStorageService.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/AliyunCloudStorageService.java new file mode 100644 index 0000000..a4de445 --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/AliyunCloudStorageService.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.dianguang.cloud.ossservice.service; + +import com.aliyun.oss.OSSClient; +import com.dianguang.cloud.ossservice.config.CloudStorageConfig; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * 阿里云存储 + * + * @author Mark sunlightcs@gmail.com + */ +public class AliyunCloudStorageService extends AbstractCloudStorageService { + + public AliyunCloudStorageService(CloudStorageConfig config){ + this.config = config; + } + + @Override + public String upload(byte[] data, String path) throws Exception { + return upload(new ByteArrayInputStream(data), path); + } + + @Override + public String upload(InputStream inputStream, String path) throws Exception { + OSSClient client = new OSSClient(config.getEndPoint(), config.getAccessKey(), + config.getSecretKey()); + try { + client.putObject(config.getBucketName(), path, inputStream); + client.shutdown(); + } catch (Exception e){ + throw new Exception("上传异常"); + } + + return "https://"+config.getUrl() + "/" + path; + } + + @Override + public String uploadSuffix(byte[] data, String suffix) throws Exception { + return upload(data, getPath(config.getPrefix(), suffix)); + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) throws Exception { + return upload(inputStream, getPath(config.getPrefix(), suffix)); + } +} \ No newline at end of file diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/HuaweiCloudStorageService.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/HuaweiCloudStorageService.java new file mode 100644 index 0000000..06b315a --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/HuaweiCloudStorageService.java @@ -0,0 +1,42 @@ +package com.dianguang.cloud.ossservice.service; + +import com.dianguang.cloud.ossservice.config.CloudStorageConfig; +import com.obs.services.ObsClient; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +public class HuaweiCloudStorageService extends AbstractCloudStorageService { + + + + public HuaweiCloudStorageService(CloudStorageConfig config){ + this.config = config; + } + @Override + public String upload(byte[] data, String path) throws Exception { + + return upload(new ByteArrayInputStream(data), path); + } + + @Override + public String uploadSuffix(byte[] data, String suffix) throws Exception { + return upload(data, getPath(config.getPrefix(), suffix)); + } + + @Override + public String upload(InputStream inputStream, String path) throws Exception { + ObsClient client = new ObsClient(config.getAccessKey(),config.getSecretKey(),config.getEndPoint()); + try { + client.putObject(config.getBucketName(), path, inputStream); + } catch (Exception e){ + throw new Exception("上传失败"); + } + return config.getUrl() + "/" + path; + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) throws Exception { + return upload(inputStream, getPath(config.getPrefix(), suffix)); + } +} diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/OSSFactory.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/OSSFactory.java new file mode 100644 index 0000000..43d3437 --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/OSSFactory.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.dianguang.cloud.ossservice.service; + + +import com.dianguang.cloud.ossservice.config.CloudStorageConfig; +import com.dianguang.cloud.ossservice.model.Constant; + +/** + * 文件上传Factory + * @author Mark sunlightcs@gmail.com + */ +public final class OSSFactory { + public static AbstractCloudStorageService build(CloudStorageConfig config){ + + if(config.getType() == Constant.CloudService.QINIU.getValue()){ + return new QiniuCloudStorageService(config); + }else if(config.getType() == Constant.CloudService.ALIYUN.getValue()){ + return new AliyunCloudStorageService(config); + }else if(config.getType() == Constant.CloudService.QCLOUD.getValue()){ + return new QcloudCloudStorageService(config); + }else if(config.getType() == Constant.CloudService.HUAWEI.getValue()){ + return new HuaweiCloudStorageService(config); + } + + return null; + } + +} \ No newline at end of file diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/QcloudCloudStorageService.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/QcloudCloudStorageService.java new file mode 100644 index 0000000..a42f2ab --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/QcloudCloudStorageService.java @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.dianguang.cloud.ossservice.service; + +import com.dianguang.cloud.ossservice.config.CloudStorageConfig; +import com.qcloud.cos.COSClient; +import com.qcloud.cos.ClientConfig; +import com.qcloud.cos.auth.BasicCOSCredentials; +import com.qcloud.cos.auth.COSCredentials; +import com.qcloud.cos.model.ObjectMetadata; +import com.qcloud.cos.model.PutObjectRequest; +import com.qcloud.cos.model.PutObjectResult; +import com.qcloud.cos.region.Region; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * 腾讯云存储 + * + * @author Mark sunlightcs@gmail.com + */ +public class QcloudCloudStorageService extends AbstractCloudStorageService { + private COSCredentials credentials; + private ClientConfig clientConfig; + + public QcloudCloudStorageService(CloudStorageConfig config){ + this.config = config; + + //初始化 + init(); + } + + private void init(){ + //1、初始化用户身份信息(secretId, secretKey) + credentials = new BasicCOSCredentials(config.getAccessKey(), config.getSecretKey()); + + //2、设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224 + clientConfig = new ClientConfig(new Region(config.getQcloudRegion())); + } + + @Override + public String upload(byte[] data, String path) throws Exception { + return upload(new ByteArrayInputStream(data), path); + } + + @Override + public String upload(InputStream inputStream, String path) throws Exception { + try { + COSClient client = new COSClient(credentials, clientConfig); + + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(inputStream.available()); + String bucketName = config.getBucketName() +"-"+ config.getQcloudAppId(); + PutObjectRequest request = new PutObjectRequest(bucketName, path, inputStream, metadata); + PutObjectResult result = client.putObject(request); + + client.shutdown(); + if(result.getETag() == null){ + throw new Exception("上传失败"); + } + } catch (IOException e) { + throw new Exception("上传失败"); + } + + return config.getUrl() + "/" + path; + } + + @Override + public String uploadSuffix(byte[] data, String suffix) throws Exception { + return upload(data, getPath(config.getPrefix(), suffix)); + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) throws Exception { + return upload(inputStream, getPath(config.getPrefix(), suffix)); + } +} \ No newline at end of file diff --git a/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/QiniuCloudStorageService.java b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/QiniuCloudStorageService.java new file mode 100644 index 0000000..b0f86c9 --- /dev/null +++ b/newadmin/oss-service/src/main/java/com/dianguang/cloud/ossservice/service/QiniuCloudStorageService.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.dianguang.cloud.ossservice.service; + +import com.dianguang.cloud.ossservice.config.CloudStorageConfig; +import com.qiniu.http.Response; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; +import com.qiniu.util.IOUtils; + +import java.io.IOException; +import java.io.InputStream; + +/** + * 七牛云存储 + * + * @author Mark sunlightcs@gmail.com + */ +public class QiniuCloudStorageService extends AbstractCloudStorageService { + private UploadManager uploadManager; + private String token; + + public QiniuCloudStorageService(CloudStorageConfig config){ + this.config = config; + + //初始化 + init(); + } + + private void init(){ + uploadManager = new UploadManager(new Configuration(Region.autoRegion())); + token = Auth.create(config.getAccessKey(), config.getSecretKey()). + uploadToken(config.getBucketName()); + + } + + @Override + public String upload(byte[] data, String path) throws Exception { + try { + Response res = uploadManager.put(data, path, token); + if (!res.isOK()) { + throw new Exception("上传失败"); + } + } catch (Exception e) { + throw new Exception("上传失败"); + } + + return config.getUrl() + "/" + path; + } + + @Override + public String upload(InputStream inputStream, String path) throws Exception { + try { + byte[] data = IOUtils.toByteArray(inputStream); + return this.upload(data, path); + } catch (IOException e) { + throw new IOException("上传失败"); + } + } + + @Override + public String uploadSuffix(byte[] data, String suffix) throws Exception { + return upload(data, getPath(config.getPrefix(), suffix)); + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) throws Exception { + return upload(inputStream, getPath(config.getPrefix(), suffix)); + } +}