diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..281336c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+.idea/
+*.iml
+**/target/
+
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..3f1f4a2
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,12 @@
+[submodule "epdc-cloud-client-yushan"]
+ path = epdc-cloud-client-yushan
+ url = http://121.42.41.42:7070/r/epdc-cloud-client-yushan.git
+[submodule "epdc-cloud-commons-yushan"]
+ path = epdc-cloud-commons-yushan
+ url = http://121.42.41.42:7070/r/epdc-cloud-commons-yushan.git
+[submodule "epdc-cloud-gateway-yushan"]
+ path = epdc-cloud-gateway-yushan
+ url = http://121.42.41.42:7070/r/epdc-cloud-gateway-yushan.git
+[submodule "epdc-cloud-parent-yushan"]
+ path = epdc-cloud-parent-yushan
+ url = http://121.42.41.42:7070/r/epdc-cloud-parent-yushan.git
diff --git a/db/mysql.sql b/db/mysql.sql
new file mode 100644
index 0000000..76dd684
--- /dev/null
+++ b/db/mysql.sql
@@ -0,0 +1,22 @@
+-- 文件上传
+CREATE TABLE sys_oss (
+ id bigint NOT NULL COMMENT 'id',
+ url varchar(200) COMMENT 'URL地址',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ PRIMARY KEY (id),
+ key idx_create_date (create_date)
+) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COMMENT='文件上传';
+
+INSERT INTO sys_menu(id, pid, url, type, icon, permissions, sort, del_flag, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000019, 'oss/oss', 0, 'icon-upload', '', 4, 0, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', 'File Upload', 'en-US');
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', '文件上传', 'zh-CN');
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', '文件上傳', 'zh-TW');
+
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000163, 1067246875800000060, '文件上传', '/oss/file', 'POST', 1, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000164, 1067246875800000060, '文件上传', '/oss/file', 'DELETE', 1, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000165, 1067246875800000060, '文件上传', '/oss/file/page', 'GET', 1, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000166, 1067246875800000060, '文件上传', '/oss/file/info', 'GET', 1, 0, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, del_flag, creator, create_date, updater, update_date) VALUES (1067246875800000167, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://pgzjvphhb.bkt.clouddn.com","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 0, 1067246875800000001, now(), 1067246875800000001, now());
diff --git a/db/oracle.sql b/db/oracle.sql
new file mode 100644
index 0000000..7710884
--- /dev/null
+++ b/db/oracle.sql
@@ -0,0 +1,27 @@
+CREATE TABLE sys_oss (
+ id NUMBER(20, 0) NOT NULL,
+ url varchar2(200),
+ creator NUMBER(20, 0),
+ create_date date,
+ PRIMARY KEY (id)
+);
+CREATE INDEX idx_sys_oss_create_date on sys_oss(create_date);
+
+COMMENT ON TABLE sys_oss IS '文件上传';
+COMMENT ON COLUMN sys_oss.id IS 'id';
+COMMENT ON COLUMN sys_oss.url IS 'URL地址';
+COMMENT ON COLUMN sys_mail_log.creator IS '创建者';
+COMMENT ON COLUMN sys_mail_log.create_date IS '创建时间';
+
+INSERT INTO sys_menu(id, pid, url, type, icon, permissions, sort, del_flag, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000019, 'oss/oss', 0, 'icon-upload', '', 4, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', 'File Upload', 'en-US');
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', '文件上传', 'zh-CN');
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', '文件上傳', 'zh-TW');
+
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000163, 1067246875800000060, '文件上传', '/oss/file', 'POST', 1, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000164, 1067246875800000060, '文件上传', '/oss/file', 'DELETE', 1, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000165, 1067246875800000060, '文件上传', '/oss/file/page', 'GET', 1, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000166, 1067246875800000060, '文件上传', '/oss/file/info', 'GET', 1, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, del_flag, creator, create_date, updater, update_date) VALUES (1067246875800000167, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://pgzjvphhb.bkt.clouddn.com","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
diff --git a/db/postgresql.sql b/db/postgresql.sql
new file mode 100644
index 0000000..683c982
--- /dev/null
+++ b/db/postgresql.sql
@@ -0,0 +1,28 @@
+CREATE TABLE sys_oss (
+ id int8 NOT NULL,
+ url varchar(200),
+ creator int8,
+ create_date timestamp,
+ PRIMARY KEY (id)
+);
+CREATE INDEX idx_sys_oss_create_date on sys_oss(create_date);
+
+COMMENT ON TABLE sys_oss IS '文件上传';
+COMMENT ON COLUMN sys_oss.id IS 'id';
+COMMENT ON COLUMN sys_oss.url IS 'URL地址';
+COMMENT ON COLUMN sys_mail_log.creator IS '创建者';
+COMMENT ON COLUMN sys_mail_log.create_date IS '创建时间';
+
+
+INSERT INTO sys_menu(id, pid, url, type, icon, permissions, sort, del_flag, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000019, 'oss/oss', 0, 'icon-upload', '', 4, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', 'File Upload', 'en-US');
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', '文件上传', 'zh-CN');
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', '文件上傳', 'zh-TW');
+
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000163, 1067246875800000060, '文件上传', '/oss/file', 'POST', 1, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000164, 1067246875800000060, '文件上传', '/oss/file', 'DELETE', 1, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000165, 1067246875800000060, '文件上传', '/oss/file/page', 'GET', 1, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000166, 1067246875800000060, '文件上传', '/oss/file/info', 'GET', 1, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, del_flag, creator, create_date, updater, update_date) VALUES (1067246875800000167, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://pgzjvphhb.bkt.clouddn.com","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
diff --git a/db/sqlserver.sql b/db/sqlserver.sql
new file mode 100644
index 0000000..c1ebc1e
--- /dev/null
+++ b/db/sqlserver.sql
@@ -0,0 +1,22 @@
+CREATE TABLE sys_oss (
+ id bigint NOT NULL,
+ url varchar(200),
+ creator bigint,
+ create_date datetime,
+ PRIMARY KEY (id)
+);
+CREATE INDEX idx_sys_oss_create_date on sys_oss(create_date);
+
+
+INSERT INTO sys_menu(id, pid, url, type, icon, permissions, sort, del_flag, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000019, 'oss/oss', 0, 'icon-upload', '', 4, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', 'File Upload', 'en-US');
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', '文件上传', 'zh-CN');
+INSERT INTO sys_language(table_name, table_id, field_name, field_value, language) VALUES ('sys_menu', 1067246875800000060, 'name', '文件上傳', 'zh-TW');
+
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000163, 1067246875800000060, '文件上传', '/oss/file', 'POST', 1, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000164, 1067246875800000060, '文件上传', '/oss/file', 'DELETE', 1, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000165, 1067246875800000060, '文件上传', '/oss/file/page', 'GET', 1, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_resource(id, resource_code, resource_name, resource_url, resource_method, menu_flag, auth_level, creator, create_date, updater, update_date) VALUES (1067246875800000166, 1067246875800000060, '文件上传', '/oss/file/info', 'GET', 1, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, del_flag, creator, create_date, updater, update_date) VALUES (1067246875800000167, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://pgzjvphhb.bkt.clouddn.com","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
diff --git a/epdc-cloud-client-yushan b/epdc-cloud-client-yushan
new file mode 160000
index 0000000..cc0e5d4
--- /dev/null
+++ b/epdc-cloud-client-yushan
@@ -0,0 +1 @@
+Subproject commit cc0e5d4a31687b9224edc53d7b8d6414e7005d6a
diff --git a/epdc-cloud-commons-yushan b/epdc-cloud-commons-yushan
new file mode 160000
index 0000000..f491284
--- /dev/null
+++ b/epdc-cloud-commons-yushan
@@ -0,0 +1 @@
+Subproject commit f49128405cd591b9aab7f129df01518c5aea143e
diff --git a/epdc-cloud-gateway-yushan b/epdc-cloud-gateway-yushan
new file mode 160000
index 0000000..2930742
--- /dev/null
+++ b/epdc-cloud-gateway-yushan
@@ -0,0 +1 @@
+Subproject commit 29307425ebc6c065fa5c2559dd4aa1013a8a7a77
diff --git a/epdc-cloud-oss/Dockerfile b/epdc-cloud-oss/Dockerfile
new file mode 100644
index 0000000..9e1c30f
--- /dev/null
+++ b/epdc-cloud-oss/Dockerfile
@@ -0,0 +1,20 @@
+# 基础镜像
+FROM openjdk:8u242-jdk-buster
+# 作者
+MAINTAINER rongchao@elink-cn.com
+# 对应pom.xml文件中的dockerfile-maven-plugin插件JAR_FILE的值
+ARG JAR_FILE
+# 对应pom.xml文件中的dockerfile-maven-plugin插件JAR_NAME的值
+ARG JAR_NAME
+# 对应pom.xml文件中的dockerfile-maven-plugin插件SERVER_PORT的值
+ARG SERVER_PORT
+# 复制打包完成后的jar文件到/opt目录下
+ENV JAR_PATH /mnt/epdc/${JAR_NAME}.jar
+ADD ${JAR_FILE} $JAR_PATH
+# /data设为环境变量
+ENV DATAPATH /data
+# 挂载/data目录到主机
+VOLUME $DATAPATH
+# 启动容器时执行
+ENTRYPOINT java -jar -Xmx1024m $JAR_PATH
+EXPOSE ${SERVER_PORT}
diff --git a/epdc-cloud-oss/pom.xml b/epdc-cloud-oss/pom.xml
new file mode 100644
index 0000000..1995e1c
--- /dev/null
+++ b/epdc-cloud-oss/pom.xml
@@ -0,0 +1,278 @@
+
+
+ * https://www.renren.io + *
+ * 版权所有,侵权必究! + */ + +package com.elink.esua.epdc.cloud; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.OSSObject; +import com.elink.esua.epdc.commons.tools.exception.RenException; +import com.elink.esua.epdc.exception.ModuleErrorCode; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; + +/** + * 阿里云存储 + * + * @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) { + return upload(new ByteArrayInputStream(data), path); + } + + @Override + public String upload(InputStream inputStream, String path) { + OSSClient client = new OSSClient(config.getAliyunEndPoint(), config.getAliyunAccessKeyId(), + config.getAliyunAccessKeySecret()); + try { + client.putObject(config.getAliyunBucketName(), path, inputStream); + client.shutdown(); + } catch (Exception e) { + throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, e, ""); + } + + return config.getAliyunDomain() + "/" + path; + } + + @Override + public String uploadSuffix(byte[] data, String suffix) { + return upload(data, getPath(config.getAliyunPrefix(), suffix)); + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) { + return upload(inputStream, getPath(config.getAliyunPrefix(), suffix)); + } + + /** + * 下载阿里云oss服务器上的文件 + * + * @param url 完整的访问连击 + * @param response + * @return void + * @author work@yujt.net.cn + * @date 2019/10/24 14:43 + */ + public void download(String url, HttpServletResponse response) throws IOException { + + OSS ossClient = new OSSClientBuilder().build(config.getAliyunEndPoint(), config.getAliyunAccessKeyId(), config.getAliyunAccessKeySecret()); + + String objectName = url.replace(config.getAliyunDomain().concat("/"), ""); + String filename = objectName.substring(objectName.lastIndexOf("/") + 1); + // 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。 + OSSObject ossObject = ossClient.getObject(config.getAliyunBucketName(), objectName); + // 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。 + InputStream content = ossObject.getObjectContent(); + if (null != content) { + response.setCharacterEncoding("UTF-8"); + response.setHeader("Pragma", "No-Cache"); + response.setHeader("Cache-Control", "No-Cache"); + response.setDateHeader("Expires", 0); + response.setContentType("application/msexcel; charset=UTF-8"); + // 设定输出文件头 + response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8")); + + OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); + byte[] buf = new byte[1024]; + + int L; + while ((L = content.read(buf)) != -1) { + toClient.write(buf, 0, L); + } + content.close(); + toClient.flush(); + toClient.close(); + ossClient.shutdown(); + } + } +} diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/CloudStorageConfig.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/CloudStorageConfig.java new file mode 100644 index 0000000..28b4011 --- /dev/null +++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/CloudStorageConfig.java @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.elink.esua.epdc.cloud; + +import com.elink.esua.epdc.commons.tools.validator.group.AliyunGroup; +import com.elink.esua.epdc.commons.tools.validator.group.QcloudGroup; +import com.elink.esua.epdc.commons.tools.validator.group.QiniuGroup; +import com.elink.esua.epdc.validator.group.FastDFSGroup; +import com.elink.esua.epdc.validator.group.LocalGroup; +import com.elink.esua.epdc.commons.tools.validator.group.AliyunGroup; +import com.elink.esua.epdc.commons.tools.validator.group.QcloudGroup; +import com.elink.esua.epdc.commons.tools.validator.group.QiniuGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Range; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 云存储配置信息 + * + * @author Mark sunlightcs@gmail.com + */ +@Data +@ApiModel(value = "云存储配置信息") +public class CloudStorageConfig implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "类型 1:七牛 2:阿里云 3:腾讯云 4:FastDFS 5:本地上传") + @Range(min=1, max=5, message = "{oss.type.range}") + private Integer type; + + @ApiModelProperty(value = "七牛绑定的域名") + @NotBlank(message="{qiniu.domain.require}", groups = QiniuGroup.class) + @URL(message = "{qiniu.domain.url}", groups = QiniuGroup.class) + private String qiniuDomain; + + @ApiModelProperty(value = "七牛路径前缀") + private String qiniuPrefix; + + @ApiModelProperty(value = "七牛ACCESS_KEY") + @NotBlank(message="{qiniu.accesskey.require}", groups = QiniuGroup.class) + private String qiniuAccessKey; + + @ApiModelProperty(value = "七牛SECRET_KEY") + @NotBlank(message="{qiniu.secretkey.require}", groups = QiniuGroup.class) + private String qiniuSecretKey; + + @ApiModelProperty(value = "七牛存储空间名") + @NotBlank(message="{qiniu.bucketname.require}", groups = QiniuGroup.class) + private String qiniuBucketName; + + @ApiModelProperty(value = "阿里云绑定的域名") + @NotBlank(message="{aliyun.domain.require}", groups = AliyunGroup.class) + @URL(message = "{aliyun.domain.url}", groups = AliyunGroup.class) + private String aliyunDomain; + + @ApiModelProperty(value = "阿里云路径前缀") + private String aliyunPrefix; + + @ApiModelProperty(value = "阿里云EndPoint") + @NotBlank(message="{aliyun.endPoint.require}", groups = AliyunGroup.class) + private String aliyunEndPoint; + + @ApiModelProperty(value = "阿里云AccessKeyId") + @NotBlank(message="{aliyun.accesskeyid.require}", groups = AliyunGroup.class) + private String aliyunAccessKeyId; + + @ApiModelProperty(value = "阿里云AccessKeySecret") + @NotBlank(message="{aliyun.accesskeysecret.require}", groups = AliyunGroup.class) + private String aliyunAccessKeySecret; + + @ApiModelProperty(value = "阿里云BucketName") + @NotBlank(message="{aliyun.bucketname.require}", groups = AliyunGroup.class) + private String aliyunBucketName; + + @ApiModelProperty(value = "腾讯云绑定的域名") + @NotBlank(message="{qcloud.domain.require}", groups = QcloudGroup.class) + @URL(message = "{qcloud.domain.url}", groups = QcloudGroup.class) + private String qcloudDomain; + + @ApiModelProperty(value = "腾讯云路径前缀") + private String qcloudPrefix; + + @ApiModelProperty(value = "腾讯云AppId") + @NotNull(message="{qcloud.appid.require}", groups = QcloudGroup.class) + private Integer qcloudAppId; + + @ApiModelProperty(value = "腾讯云SecretId") + @NotBlank(message="{qcloud.secretId.require}", groups = QcloudGroup.class) + private String qcloudSecretId; + + @ApiModelProperty(value = "腾讯云SecretKey") + @NotBlank(message="{qcloud.secretkey.require}", groups = QcloudGroup.class) + private String qcloudSecretKey; + + @ApiModelProperty(value = "腾讯云BucketName") + @NotBlank(message="{qcloud.bucketname.require}", groups = QcloudGroup.class) + private String qcloudBucketName; + + @ApiModelProperty(value = "腾讯云COS所属地区") + @NotBlank(message="{qcloud.region.require}", groups = QcloudGroup.class) + private String qcloudRegion; + + @ApiModelProperty(value = "FastDFS绑定的域名") + @NotBlank(message="{fastdfs.domain.require}", groups = FastDFSGroup.class) + @URL(message = "{fastdfs.domain.url}", groups = FastDFSGroup.class) + private String fastdfsDomain; + + @ApiModelProperty(value = "本地上传绑定的域名") + @NotBlank(message="{local.domain.require}", groups = LocalGroup.class) + @URL(message = "{local.domain.url}", groups = LocalGroup.class) + private String localDomain; + + @ApiModelProperty(value = "本地上传路径前缀") + private String localPrefix; + + @ApiModelProperty(value = "本地上传存储目录") + @NotBlank(message="{local.path.url}", groups = LocalGroup.class) + private String localPath; + +} diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/FastDFSCloudStorageService.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/FastDFSCloudStorageService.java new file mode 100644 index 0000000..706b2da --- /dev/null +++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/FastDFSCloudStorageService.java @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + *
+ * https://www.renren.io + *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.cloud;
+
+import com.elink.esua.epdc.commons.tools.exception.RenException;
+import com.elink.esua.epdc.commons.tools.utils.SpringContextUtils;
+import com.elink.esua.epdc.exception.ModuleErrorCode;
+import com.github.tobato.fastdfs.domain.StorePath;
+import com.github.tobato.fastdfs.service.DefaultGenerateStorageClient;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+/**
+ * FastDFS
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class FastDFSCloudStorageService extends AbstractCloudStorageService {
+ private static DefaultGenerateStorageClient defaultGenerateStorageClient;
+
+ static {
+ defaultGenerateStorageClient = (DefaultGenerateStorageClient) SpringContextUtils.getBean("defaultGenerateStorageClient");
+ }
+
+ public FastDFSCloudStorageService(CloudStorageConfig config) {
+ this.config = config;
+ }
+
+ @Override
+ public String upload(byte[] data, String path) {
+ return upload(new ByteArrayInputStream(data), path);
+ }
+
+ @Override
+ public String upload(InputStream inputStream, String suffix) {
+ StorePath storePath;
+ try {
+ storePath = defaultGenerateStorageClient.uploadFile("epdcFile", inputStream, inputStream.available(), suffix);
+ } catch (Exception ex) {
+ throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, ex, ex.getMessage());
+ }
+
+ return config.getFastdfsDomain() + "/" + storePath.getPath();
+ }
+
+ @Override
+ public String uploadSuffix(byte[] data, String suffix) {
+ return upload(data, suffix);
+ }
+
+ @Override
+ public String uploadSuffix(InputStream inputStream, String suffix) {
+ return upload(inputStream, suffix);
+ }
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/FastDFSImport.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/FastDFSImport.java
new file mode 100644
index 0000000..446a200
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/FastDFSImport.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.cloud;
+
+import com.github.tobato.fastdfs.FdfsClientConfig;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableMBeanExport;
+import org.springframework.context.annotation.Import;
+import org.springframework.jmx.support.RegistrationPolicy;
+
+/**
+ * 导入FastDFS-Client组件
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Configuration
+@Import(FdfsClientConfig.class)
+@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
+public class FastDFSImport {
+
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/LocalCloudStorageService.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/LocalCloudStorageService.java
new file mode 100644
index 0000000..816842c
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/LocalCloudStorageService.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.cloud;
+
+import com.elink.esua.epdc.commons.tools.exception.RenException;
+import com.elink.esua.epdc.exception.ModuleErrorCode;
+import org.apache.commons.io.FileUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * 本地上传
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class LocalCloudStorageService extends AbstractCloudStorageService {
+
+ public LocalCloudStorageService(CloudStorageConfig config){
+ this.config = config;
+ }
+
+ @Override
+ public String upload(byte[] data, String path) {
+ return upload(new ByteArrayInputStream(data), path);
+ }
+
+ @Override
+ public String upload(InputStream inputStream, String path) {
+ File file = new File(config.getLocalPath() + File.separator + path);
+ try {
+ FileUtils.copyToFile(inputStream, file);
+ } catch (IOException e) {
+ throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, e, "");
+ }
+ return config.getLocalDomain() + "/" + path;
+ }
+
+ @Override
+ public String uploadSuffix(byte[] data, String suffix) {
+ return upload(data, getPath(config.getLocalPrefix(), suffix));
+ }
+
+ @Override
+ public String uploadSuffix(InputStream inputStream, String suffix) {
+ return upload(inputStream, getPath(config.getLocalPrefix(), suffix));
+ }
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/OssFactory.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/OssFactory.java
new file mode 100644
index 0000000..e23a1f8
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/OssFactory.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.cloud;
+
+import com.elink.esua.epdc.commons.tools.utils.SpringContextUtils;
+import com.elink.esua.epdc.remote.ParamsRemoteService;
+import com.elink.esua.epdc.utils.ModuleConstant;
+import com.elink.esua.epdc.commons.tools.utils.SpringContextUtils;
+import com.elink.esua.epdc.enums.OssTypeEnum;
+import com.elink.esua.epdc.remote.ParamsRemoteService;
+import com.elink.esua.epdc.utils.ModuleConstant;
+
+/**
+ * 文件上传Factory
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public final class OssFactory {
+ private static ParamsRemoteService paramsRemoteService;
+
+ static {
+ OssFactory.paramsRemoteService = SpringContextUtils.getBean(ParamsRemoteService.class);
+ }
+
+ public static AbstractCloudStorageService build(){
+ //获取云存储配置信息
+ CloudStorageConfig config = paramsRemoteService.getValueObject(ModuleConstant.CLOUD_STORAGE_CONFIG_KEY, CloudStorageConfig.class);
+
+ if(config.getType() == OssTypeEnum.QINIU.value()){
+ return new QiniuCloudStorageService(config);
+ }else if(config.getType() == OssTypeEnum.ALIYUN.value()){
+ return new AliyunCloudStorageService(config);
+ }else if(config.getType() == OssTypeEnum.QCLOUD.value()){
+ return new QcloudCloudStorageService(config);
+ }else if(config.getType() == OssTypeEnum.FASTDFS.value()){
+ return new FastDFSCloudStorageService(config);
+ }else if(config.getType() == OssTypeEnum.LOCAL.value()){
+ return new LocalCloudStorageService(config);
+ }
+
+ return null;
+ }
+
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/QcloudCloudStorageService.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/QcloudCloudStorageService.java
new file mode 100644
index 0000000..8b6d559
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/QcloudCloudStorageService.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.cloud;
+
+import com.elink.esua.epdc.commons.tools.exception.RenException;
+import com.elink.esua.epdc.exception.ModuleErrorCode;
+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 com.elink.esua.epdc.commons.tools.exception.RenException;
+import com.elink.esua.epdc.exception.ModuleErrorCode;
+
+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.getQcloudSecretId(), config.getQcloudSecretKey());
+
+ //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) {
+ return upload(new ByteArrayInputStream(data), path);
+ }
+
+ @Override
+ public String upload(InputStream inputStream, String path) {
+ try {
+ COSClient client = new COSClient(credentials, clientConfig);
+
+ ObjectMetadata metadata = new ObjectMetadata();
+ metadata.setContentLength(inputStream.available());
+ String bucketName = config.getQcloudBucketName() +"-"+ config.getQcloudAppId();
+ PutObjectRequest request = new PutObjectRequest(bucketName, path, inputStream, metadata);
+ PutObjectResult result = client.putObject(request);
+
+ client.shutdown();
+ if(result.getETag() == null){
+ throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, "");
+ }
+ } catch (IOException e) {
+ throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, e, "");
+ }
+
+ return config.getQcloudDomain() + "/" + path;
+ }
+
+ @Override
+ public String uploadSuffix(byte[] data, String suffix) {
+ return upload(data, getPath(config.getQcloudPrefix(), suffix));
+ }
+
+ @Override
+ public String uploadSuffix(InputStream inputStream, String suffix) {
+ return upload(inputStream, getPath(config.getQcloudPrefix(), suffix));
+ }
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/QiniuCloudStorageService.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/QiniuCloudStorageService.java
new file mode 100644
index 0000000..5d795b1
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/cloud/QiniuCloudStorageService.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.cloud;
+
+import com.elink.esua.epdc.commons.tools.exception.RenException;
+import com.elink.esua.epdc.exception.ModuleErrorCode;
+import com.qiniu.common.Zone;
+import com.qiniu.http.Response;
+import com.qiniu.storage.Configuration;
+import com.qiniu.storage.UploadManager;
+import com.qiniu.util.Auth;
+
+import com.elink.esua.epdc.commons.tools.exception.RenException;
+import com.elink.esua.epdc.exception.ModuleErrorCode;
+import org.apache.commons.io.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(Zone.autoZone()));
+ token = Auth.create(config.getQiniuAccessKey(), config.getQiniuSecretKey()).
+ uploadToken(config.getQiniuBucketName());
+
+ }
+
+ @Override
+ public String upload(byte[] data, String path) {
+ try {
+ Response res = uploadManager.put(data, path, token);
+ if (!res.isOK()) {
+ throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, res.toString());
+ }
+ } catch (Exception e) {
+ throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, e, "");
+ }
+
+ return config.getQiniuDomain() + "/" + path;
+ }
+
+ @Override
+ public String upload(InputStream inputStream, String path) {
+ try {
+ byte[] data = IOUtils.toByteArray(inputStream);
+ return this.upload(data, path);
+ } catch (IOException e) {
+ throw new RenException(ModuleErrorCode.OSS_UPLOAD_FILE_ERROR, e, "");
+ }
+ }
+
+ @Override
+ public String uploadSuffix(byte[] data, String suffix) {
+ return upload(data, getPath(config.getQiniuPrefix(), suffix));
+ }
+
+ @Override
+ public String uploadSuffix(InputStream inputStream, String suffix) {
+ return upload(inputStream, getPath(config.getQiniuPrefix(), suffix));
+ }
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java
new file mode 100644
index 0000000..6dfc1ee
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.config;
+
+import com.elink.esua.epdc.commons.tools.config.ModuleConfig;
+import com.elink.esua.epdc.commons.tools.config.ModuleConfig;
+import org.springframework.stereotype.Service;
+
+/**
+ * 模块配置信息
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Service
+public class ModuleConfigImpl implements ModuleConfig {
+ @Override
+ public String getName() {
+ return "oss";
+ }
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/config/SwaggerConfig.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/config/SwaggerConfig.java
new file mode 100644
index 0000000..caed301
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/config/SwaggerConfig.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.config;
+
+import com.elink.esua.epdc.commons.tools.constant.Constant;
+import com.elink.esua.epdc.commons.tools.constant.Constant;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+/**
+ * Swagger配置
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig implements WebMvcConfigurer {
+
+ @Bean
+ public Docket createRestApi() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .select()
+ //加了ApiOperation注解的类,才生成接口文档
+ .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+ .paths(PathSelectors.any())
+ .build()
+ .directModelSubstitute(java.util.Date.class, String.class)
+ .securitySchemes(security());
+
+ }
+
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder()
+ .title("人人开源")
+ .description("OSS接口文档")
+ .termsOfServiceUrl("https://www.renren.io")
+ .version("1.1.0")
+ .build();
+ }
+
+ private List
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.controller;
+
+import com.elink.esua.epdc.UploadImgAllDTO;
+import com.elink.esua.epdc.cloud.AbstractCloudStorageService;
+import com.elink.esua.epdc.cloud.AliyunCloudStorageService;
+import com.elink.esua.epdc.cloud.CloudStorageConfig;
+import com.elink.esua.epdc.cloud.OssFactory;
+import com.elink.esua.epdc.commons.tools.annotation.LogOperation;
+import com.elink.esua.epdc.commons.tools.constant.NumConstant;
+import com.elink.esua.epdc.commons.tools.page.PageData;
+import com.elink.esua.epdc.commons.tools.utils.CompressImgUtils;
+import com.elink.esua.epdc.commons.tools.utils.Result;
+import com.elink.esua.epdc.commons.tools.validator.ValidatorUtils;
+import com.elink.esua.epdc.commons.tools.validator.group.AliyunGroup;
+import com.elink.esua.epdc.commons.tools.validator.group.QcloudGroup;
+import com.elink.esua.epdc.commons.tools.validator.group.QiniuGroup;
+import com.elink.esua.epdc.dto.UploadDTO;
+import com.elink.esua.epdc.dto.UploadFormDTO;
+import com.elink.esua.epdc.dto.UploadToOssDTO;
+import com.elink.esua.epdc.entity.OssEntity;
+import com.elink.esua.epdc.enums.OssTypeEnum;
+import com.elink.esua.epdc.exception.ModuleErrorCode;
+import com.elink.esua.epdc.remote.ParamsRemoteService;
+import com.elink.esua.epdc.service.OssService;
+import com.elink.esua.epdc.utils.ModuleConstant;
+import com.google.gson.Gson;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import springfox.documentation.annotations.ApiIgnore;
+import sun.misc.BASE64Decoder;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件上传
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@RestController
+@RequestMapping("file")
+@Api(tags = "文件上传")
+public class OssController {
+
+ @Autowired
+ private OssService ossService;
+
+ @Autowired
+ private ParamsRemoteService paramsRemoteService;
+
+ private final static String KEY = ModuleConstant.CLOUD_STORAGE_CONFIG_KEY;
+
+ @GetMapping("page")
+ @ApiOperation(value = "分页")
+ public Result
+ * 如:100001(100001代表模块,001代表业务代码)
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.service;
+
+import com.elink.esua.epdc.commons.mybatis.service.BaseService;
+import com.elink.esua.epdc.commons.tools.page.PageData;
+import com.elink.esua.epdc.commons.tools.utils.Result;
+import com.elink.esua.epdc.dto.UploadDTO;
+import com.elink.esua.epdc.entity.OssEntity;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件上传
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface OssService extends BaseService
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.elink.esua.epdc.cloud.OssFactory;
+import com.elink.esua.epdc.commons.mybatis.service.impl.BaseServiceImpl;
+import com.elink.esua.epdc.commons.tools.constant.Constant;
+import com.elink.esua.epdc.commons.tools.constant.NumConstant;
+import com.elink.esua.epdc.commons.tools.page.PageData;
+import com.elink.esua.epdc.commons.tools.utils.CompressImgUtils;
+import com.elink.esua.epdc.commons.tools.utils.Result;
+import com.elink.esua.epdc.dao.OssDao;
+import com.elink.esua.epdc.dto.UploadDTO;
+import com.elink.esua.epdc.entity.OssEntity;
+import com.elink.esua.epdc.service.OssService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class OssServiceImpl extends BaseServiceImpl> compressImg(@RequestBody List
> compressImg(List
> compressImg(List
>().error("imgUrlList不能为空");
+ }
+ for (int i = 0; i < imgUrlList.size(); i++) {
+ String imgUrl = imgUrlList.get(i);
+ byte[] data = CompressImgUtils.compressImg(imgUrl);
+ //上传文件
+ String fileUrl = OssFactory.build().uploadSuffix(data, "jpg");
+ this.afterUpload(fileUrl, data.length);
+ resultList.add(fileUrl);
+ }
+ return new Result
>().ok(resultList);
+ }
+
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/utils/ModuleConstant.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/utils/ModuleConstant.java
new file mode 100644
index 0000000..1e0ff48
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/utils/ModuleConstant.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.utils;
+
+import com.elink.esua.epdc.commons.tools.constant.Constant;
+import com.elink.esua.epdc.commons.tools.constant.Constant;
+
+/**
+ * 模块常量
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.1.0
+ */
+public interface ModuleConstant extends Constant {
+ /**
+ * 云存储配置KEY
+ */
+ String CLOUD_STORAGE_CONFIG_KEY = "CLOUD_STORAGE_CONFIG_KEY";
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/validator/group/FastDFSGroup.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/validator/group/FastDFSGroup.java
new file mode 100644
index 0000000..3f41600
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/validator/group/FastDFSGroup.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.validator.group;
+
+/**
+ * FastDFS
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface FastDFSGroup {
+}
diff --git a/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/validator/group/LocalGroup.java b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/validator/group/LocalGroup.java
new file mode 100644
index 0000000..e48b9f8
--- /dev/null
+++ b/epdc-cloud-oss/src/main/java/com/elink/esua/epdc/validator/group/LocalGroup.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.validator.group;
+
+/**
+ * 本地上传
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface LocalGroup {
+}
diff --git a/epdc-cloud-oss/src/main/resources/application.yml b/epdc-cloud-oss/src/main/resources/application.yml
new file mode 100644
index 0000000..3fd834e
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/application.yml
@@ -0,0 +1,101 @@
+#server:
+# port: @server.port@
+# servlet:
+# context-path: /oss
+#
+#nacos:
+# config:
+# server-addr: @nacos.server-addr@
+# type: YAML
+# namespace: @nacos.config.namespace@
+# group: @nacos.config.group@
+# dataId: epdc-oss-server
+# bootstrap:
+# enable: true
+# log:
+# enable: @nacos.config.bootstrap.log.enable@
+#
+#spring:
+# application:
+# name: epdc-oss-server
+server:
+ port: @server.port@
+ servlet:
+ context-path: /oss
+
+spring:
+ application:
+ name: epdc-oss-server
+ # 环境 dev|test|prod
+ profiles:
+ active: @spring.profiles.active@
+ messages:
+ encoding: UTF-8
+ basename: i18n/messages,i18n/messages_common
+ jackson:
+ time-zone: GMT+8
+ date-format: yyyy-MM-dd HH:mm:ss
+ servlet:
+ multipart:
+ max-file-size: 1024MB
+ max-request-size: 1024MB
+ enabled: true
+ redis:
+ database: @spring.redis.index@
+ host: @spring.redis.host@
+ timeout: 30s
+ port: @spring.redis.port@
+ password: @spring.redis.password@
+ cloud:
+ nacos:
+ discovery:
+ server-addr: @nacos.server-addr@
+ register-enabled: @nacos.register-enabled@
+ ip: @nacos.ip@
+ namespace: @nacos.namespace@
+ alibaba:
+ seata:
+ tx-service-group: epdc-oss-server-fescar-service-group
+ datasource:
+ druid:
+ driver-class-name: com.mysql.jdbc.Driver
+ url: @spring.datasource.druid.url@
+ username: @spring.datasource.druid.username@
+ password: @spring.datasource.druid.password@
+
+fdfs:
+ so-timeout: 600000
+ connect-timeout: 6000
+ tracker-list: #TrackerList参数,支持多个
+ - @fastdfs.server-addr@
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: "*"
+ endpoint:
+ health:
+ show-details: ALWAYS
+
+
+mybatis-plus:
+ mapper-locations: classpath:/mapper/**/*.xml
+ #实体扫描,多个package用逗号或者分号分隔
+ typeAliasesPackage: io.renren.entity;com.elink.esua.epdc.entity
+ global-config:
+ #数据库相关配置
+ db-config:
+ #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
+ id-type: ID_WORKER
+ #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
+ field-strategy: NOT_NULL
+ #驼峰下划线转换
+ column-underline: true
+ banner: false
+ #原生配置
+ configuration:
+ map-underscore-to-camel-case: true
+ cache-enabled: false
+ call-setters-on-nulls: true
+ jdbc-type-for-null: 'null'
diff --git a/epdc-cloud-oss/src/main/resources/i18n/messages.properties b/epdc-cloud-oss/src/main/resources/i18n/messages.properties
new file mode 100644
index 0000000..b613783
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/i18n/messages.properties
@@ -0,0 +1,3 @@
+#Default
+100001001=\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25{0}
+100001002=\u8BF7\u4E0A\u4F20\u6587\u4EF6
\ No newline at end of file
diff --git a/epdc-cloud-oss/src/main/resources/i18n/messages_en_US.properties b/epdc-cloud-oss/src/main/resources/i18n/messages_en_US.properties
new file mode 100644
index 0000000..30726cd
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/i18n/messages_en_US.properties
@@ -0,0 +1,3 @@
+#English
+100001001=Failed to upload file {0}
+100001002=Please upload a file
\ No newline at end of file
diff --git a/epdc-cloud-oss/src/main/resources/i18n/messages_zh_CN.properties b/epdc-cloud-oss/src/main/resources/i18n/messages_zh_CN.properties
new file mode 100644
index 0000000..b8f07f8
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/i18n/messages_zh_CN.properties
@@ -0,0 +1,3 @@
+#\u7B80\u4F53\u4E2D\u6587
+100001001=\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25{0}
+100001002=\u8BF7\u4E0A\u4F20\u6587\u4EF6
\ No newline at end of file
diff --git a/epdc-cloud-oss/src/main/resources/i18n/messages_zh_TW.properties b/epdc-cloud-oss/src/main/resources/i18n/messages_zh_TW.properties
new file mode 100644
index 0000000..82a778c
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/i18n/messages_zh_TW.properties
@@ -0,0 +1,3 @@
+#\u7E41\u4F53\u4E2D\u6587
+100001001=\u4E0A\u50B3\u6587\u4EF6\u5931\u6557{0}
+100001002=\u8ACB\u4E0A\u50B3\u6587\u4EF6
\ No newline at end of file
diff --git a/epdc-cloud-oss/src/main/resources/i18n/validation.properties b/epdc-cloud-oss/src/main/resources/i18n/validation.properties
new file mode 100644
index 0000000..64f6236
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/i18n/validation.properties
@@ -0,0 +1,31 @@
+#Default
+oss.type.range=\u7C7B\u578B\u53D6\u503C\u8303\u56F41~5
+
+aliyun.accesskeyid.require=\u963F\u91CC\u4E91AccessKeyId\u4E0D\u80FD\u4E3A\u7A7A
+aliyun.accesskeysecret.require=\u963F\u91CC\u4E91AccessKeySecret\u4E0D\u80FD\u4E3A\u7A7A
+aliyun.domain.require=\u963F\u91CC\u4E91\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+aliyun.domain.url=\u963F\u91CC\u4E91\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+aliyun.endPoint.require=\u963F\u91CC\u4E91EndPoint\u4E0D\u80FD\u4E3A\u7A7A
+aliyun.bucketname.require=\u963F\u91CC\u4E91BucketName\u4E0D\u80FD\u4E3A\u7A7A
+
+qcloud.appid.require=\u817E\u8BAF\u4E91AppId\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.appkey.require=\u817E\u8BAF\u4E91AppKey\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.secretId.require=\u817E\u8BAF\u4E91SecretId\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.secretkey.require=\u817E\u8BAF\u4E91SecretKey\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.domain.require=\u817E\u8BAF\u4E91\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.domain.url=\u817E\u8BAF\u4E91\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+qcloud.bucketname.require=\u817E\u8BAF\u4E91BucketName\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.region.require=\u6240\u5C5E\u5730\u533A\u4E0D\u80FD\u4E3A\u7A7A
+
+qiniu.domain.require=\u4E03\u725B\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+qiniu.domain.url=\u4E03\u725B\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+qiniu.accesskey.require=\u4E03\u725BAccessKey\u4E0D\u80FD\u4E3A\u7A7A
+qiniu.secretkey.require=\u4E03\u725BSecretKey\u4E0D\u80FD\u4E3A\u7A7A
+qiniu.bucketname.require=\u4E03\u725B\u7A7A\u95F4\u540D\u4E0D\u80FD\u4E3A\u7A7A
+
+fastdfs.domain.require=FastDFS\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+fastdfs.domain.url=FastDFS\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+
+local.domain.require=\u672C\u5730\u4E0A\u4F20\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+local.domain.url=\u672C\u5730\u4E0A\u4F20\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+local.path.url=\u5B58\u50A8\u76EE\u5F55\u4E0D\u80FD\u4E3A\u7A7A
\ No newline at end of file
diff --git a/epdc-cloud-oss/src/main/resources/i18n/validation_en_US.properties b/epdc-cloud-oss/src/main/resources/i18n/validation_en_US.properties
new file mode 100644
index 0000000..6d00a96
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/i18n/validation_en_US.properties
@@ -0,0 +1,31 @@
+#English
+oss.type.range=Type ranges from 1 to 5
+
+aliyun.accesskeyid.require=Aliyun AccessKeyId cannot be empty
+aliyun.accesskeysecret.require=Aliyun AccessKeySecret cannot be empty
+aliyun.domain.require=Aliyun bound domain name cannot be empty
+aliyun.domain.url=Aliyun binding domain name format is incorrect
+aliyun.endPoint.require=The aliyun EndPoint cannot be empty
+aliyun.bucketname.require=Aliyun BucketName cannot be empty
+
+qcloud.appid.require=Tencent cloud AppId cannot be empty
+qcloud.appkey.require=Tencent cloud AppKey cannot be empty
+qcloud.secretId.require=Tencent cloud SecretId cannot be empty
+qcloud.secretkey.require=Tencent cloud SecretKey cannot be empty
+qcloud.domain.require=Tencent cloud bound domain name cannot be empty
+qcloud.domain.url=Tencent cloud binding domain name format is incorrect
+qcloud.bucketname.require=Tencent cloud BucketName cannot be empty
+qcloud.region.require=The region cannot be empty
+
+qiniu.domain.require=Bound domain name cannot be empty
+qiniu.domain.url=Binding domain name format is incorrect
+qiniu.accesskey.require=The AccessKey cannot be empty
+qiniu.secretkey.require=The SecretKey of seven cows cannot be empty
+qiniu.bucketname.require=Space names cannot be empty
+
+fastdfs.domain.require=FastDFS bound domain name cannot be empty
+fastdfs.domain.url=FastDFS bound domain name format is incorrect
+
+local.domain.require=Local upload bound domain name cannot be empty
+local.domain.url=The domain name bound for local upload is not formatted correctly
+local.path.url=The storage directory cannot be empty
\ No newline at end of file
diff --git a/epdc-cloud-oss/src/main/resources/i18n/validation_zh_CN.properties b/epdc-cloud-oss/src/main/resources/i18n/validation_zh_CN.properties
new file mode 100644
index 0000000..8d5d92f
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/i18n/validation_zh_CN.properties
@@ -0,0 +1,31 @@
+#\u7B80\u4F53\u4E2D\u6587
+oss.type.range=\u7C7B\u578B\u53D6\u503C\u8303\u56F41~5
+
+aliyun.accesskeyid.require=\u963F\u91CC\u4E91AccessKeyId\u4E0D\u80FD\u4E3A\u7A7A
+aliyun.accesskeysecret.require=\u963F\u91CC\u4E91AccessKeySecret\u4E0D\u80FD\u4E3A\u7A7A
+aliyun.domain.require=\u963F\u91CC\u4E91\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+aliyun.domain.url=\u963F\u91CC\u4E91\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+aliyun.endPoint.require=\u963F\u91CC\u4E91EndPoint\u4E0D\u80FD\u4E3A\u7A7A
+aliyun.bucketname.require=\u963F\u91CC\u4E91BucketName\u4E0D\u80FD\u4E3A\u7A7A
+
+qcloud.appid.require=\u817E\u8BAF\u4E91AppId\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.appkey.require=\u817E\u8BAF\u4E91AppKey\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.secretId.require=\u817E\u8BAF\u4E91SecretId\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.secretkey.require=\u817E\u8BAF\u4E91SecretKey\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.domain.require=\u817E\u8BAF\u4E91\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.domain.url=\u817E\u8BAF\u4E91\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+qcloud.bucketname.require=\u817E\u8BAF\u4E91BucketName\u4E0D\u80FD\u4E3A\u7A7A
+qcloud.region.require=\u6240\u5C5E\u5730\u533A\u4E0D\u80FD\u4E3A\u7A7A
+
+qiniu.domain.require=\u4E03\u725B\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+qiniu.domain.url=\u4E03\u725B\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+qiniu.accesskey.require=\u4E03\u725BAccessKey\u4E0D\u80FD\u4E3A\u7A7A
+qiniu.secretkey.require=\u4E03\u725BSecretKey\u4E0D\u80FD\u4E3A\u7A7A
+qiniu.bucketname.require=\u4E03\u725B\u7A7A\u95F4\u540D\u4E0D\u80FD\u4E3A\u7A7A
+
+fastdfs.domain.require=FastDFS\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+fastdfs.domain.url=FastDFS\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+
+local.domain.require=\u672C\u5730\u4E0A\u4F20\u7ED1\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A
+local.domain.url=\u672C\u5730\u4E0A\u4F20\u7ED1\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u786E
+local.path.url=\u5B58\u50A8\u76EE\u5F55\u4E0D\u80FD\u4E3A\u7A7A
\ No newline at end of file
diff --git a/epdc-cloud-oss/src/main/resources/i18n/validation_zh_TW.properties b/epdc-cloud-oss/src/main/resources/i18n/validation_zh_TW.properties
new file mode 100644
index 0000000..d58ef5f
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/i18n/validation_zh_TW.properties
@@ -0,0 +1,31 @@
+#\u7E41\u4F53\u4E2D\u6587
+oss.type.range=\u985E\u578B\u53D6\u503C\u7BC4\u570D1~5
+
+aliyun.accesskeyid.require=\u963F\u91CC\u96F2AccessKeyId\u4E0D\u80FD\u70BA\u7A7A
+aliyun.accesskeysecret.require=\u963F\u91CC\u96F2AccessKeySecret\u4E0D\u80FD\u70BA\u7A7A
+aliyun.domain.require=\u963F\u91CC\u96F2\u7D81\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u70BA\u7A7A
+aliyun.domain.url=\u963F\u91CC\u96F2\u7D81\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u78BA
+aliyun.endPoint.require=\u963F\u91CC\u96F2EndPoint\u4E0D\u80FD\u70BA\u7A7A
+aliyun.bucketname.require=\u963F\u91CC\u96F2BucketName\u4E0D\u80FD\u70BA\u7A7A
+
+qcloud.appid.require=\u9A30\u8A0A\u96F2AppId\u4E0D\u80FD\u70BA\u7A7A
+qcloud.appkey.require=\u9A30\u8A0A\u96F2AppKey\u4E0D\u80FD\u70BA\u7A7A
+qcloud.secretId.require=\u9A30\u8A0A\u96F2SecretId\u4E0D\u80FD\u70BA\u7A7A
+qcloud.secretkey.require=\u9A30\u8A0A\u96F2SecretKey\u4E0D\u80FD\u70BA\u7A7A
+qcloud.domain.require=\u9A30\u8A0A\u96F2\u7D81\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u70BA\u7A7A
+qcloud.domain.url=\u9A30\u8A0A\u96F2\u7D81\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u78BA
+qcloud.bucketname.require=\u9A30\u8A0A\u96F2BucketName\u4E0D\u80FD\u70BA\u7A7A
+qcloud.region.require=\u6240\u5C6C\u5730\u5340\u4E0D\u80FD\u70BA\u7A7A
+
+qiniu.domain.require=\u4E03\u725B\u7D81\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u70BA\u7A7A
+qiniu.domain.url=\u4E03\u725B\u7D81\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u78BA
+qiniu.accesskey.require=\u4E03\u725BAccessKey\u4E0D\u80FD\u70BA\u7A7A
+qiniu.secretkey.require=\u4E03\u725BSecretKey\u4E0D\u80FD\u70BA\u7A7A
+qiniu.bucketname.require=\u4E03\u725B\u7A7A\u9593\u540D\u4E0D\u80FD\u70BA\u7A7A
+
+fastdfs.domain.require=FastDFS\u7D81\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u70BA\u7A7A
+fastdfs.domain.url=FastDFS\u7D81\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u78BA
+
+local.domain.require=\u672C\u5730\u4E0A\u50B3\u7D81\u5B9A\u7684\u57DF\u540D\u4E0D\u80FD\u70BA\u7A7A
+local.domain.url=\u672C\u5730\u4E0A\u50B3\u7D81\u5B9A\u7684\u57DF\u540D\u683C\u5F0F\u4E0D\u6B63\u78BA
+local.path.url=\u5B58\u5132\u76EE\u9304\u4E0D\u80FD\u70BA\u7A7A
\ No newline at end of file
diff --git a/epdc-cloud-oss/src/main/resources/logback-spring.xml b/epdc-cloud-oss/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..87e7515
--- /dev/null
+++ b/epdc-cloud-oss/src/main/resources/logback-spring.xml
@@ -0,0 +1,159 @@
+
+