杨杰 6 gadi atpakaļ
revīzija
8d00981f22

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+/target/
+/.settings/
+/bin/
+.classpath
+.project

+ 11 - 0
Dockerfile

@@ -0,0 +1,11 @@
+FROM openjdk:8-jdk-alpine
+
+MAINTAINER llisoft sunlin1111@163.com
+
+RUN echo "Asia/Shanghai" > /etc/timezone
+
+ADD target/*.jar app.jar
+
+EXPOSE 9002
+
+ENTRYPOINT ["java","-jar","/app.jar"]

+ 113 - 0
pom.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	
+	<groupId>com.llisoft</groupId>
+    <artifactId>mta_service_file</artifactId>
+    <version>1.0.0</version>
+    <packaging>jar</packaging>
+
+    <name>mta_service_file</name>
+    <description>Demo project for Spring Boot</description>
+	
+	<parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.0.3.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
+    </properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-security</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-redis</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>de.codecentric</groupId>
+			<artifactId>spring-boot-admin-starter-client</artifactId>
+			<version>2.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>com.aliyun.oss</groupId>
+			<artifactId>aliyun-sdk-oss</artifactId>
+			<version>3.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger2</artifactId>
+			<version>2.7.0</version>
+		</dependency>
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger-ui</artifactId>
+			<version>2.7.0</version>
+		</dependency>
+		
+		<dependency>
+			<groupId>com.llisoft</groupId>
+			<artifactId>mta_common</artifactId>
+			<version>0.0.1-SNAPSHOT</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-devtools</artifactId>
+			<optional>true</optional>
+		</dependency>
+	</dependencies>
+	
+	<dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<skipTests>true</skipTests>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	
+</project>

+ 1 - 0
readme.md

@@ -0,0 +1 @@
+#### 文件服务

+ 21 - 0
src/main/java/com/llisoft/service/file/Application.java

@@ -0,0 +1,21 @@
+package com.llisoft.service.file;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+
+@EnableEurekaClient // 注册中心客户端 同类注解 @EnableDiscoveryClient
+@SpringBootApplication
+public class Application {
+	
+	private static Logger logger = LoggerFactory.getLogger(Application.class);
+	
+	
+	public static void main(String[] args) {
+		SpringApplication.run(Application.class, args);
+		logger.info("service is running...");
+	}
+	
+}

+ 62 - 0
src/main/java/com/llisoft/service/file/config/ErrorConfig.java

@@ -0,0 +1,62 @@
+package com.llisoft.service.file.config;
+
+import java.util.Objects;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.web.servlet.error.ErrorController;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.llisoft.common.constant.CodeEnum;
+import com.llisoft.common.vo.ResponseVo;
+
+/**
+ * 框架级异常处理, 覆盖默认/error
+ * 根据错误信息返回具体的json结果
+ * 模仿 org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController
+ * @author YangJie [2018年12月27日]
+ */
+@RestController
+public class ErrorConfig implements ErrorController {
+	
+	private Logger logger = LoggerFactory.getLogger(ErrorConfig.class);
+	
+
+	@RequestMapping("/error")
+	public ResponseVo<Object> error(HttpServletRequest request, HttpServletResponse response) {
+		response.setStatus(200); // 状态码全部200
+		Object statusCode = request.getAttribute("javax.servlet.error.status_code");
+		if(Objects.nonNull(statusCode) && statusCode instanceof Integer) {
+			int code = Integer.parseInt(statusCode.toString());
+			if(code == CodeEnum.C400.getCode()) {
+				logger.error("/error: {}", CodeEnum.C400.getMsg());
+				return ResponseVo.build(CodeEnum.C400);
+			}else if (code == CodeEnum.C401.getCode()) {
+				logger.error("/error: {}", CodeEnum.C401.getMsg());
+				return ResponseVo.build(CodeEnum.C401);
+			}else if (code == CodeEnum.C402.getCode()) {
+				logger.error("/error: {}", CodeEnum.C402.getMsg());
+				return ResponseVo.build(CodeEnum.C402);
+			}else if (code == CodeEnum.C403.getCode()) {
+				logger.error("/error: {}", CodeEnum.C403.getMsg());
+				return ResponseVo.build(CodeEnum.C403);
+			}else if (code == CodeEnum.C404.getCode()) {
+				logger.error("/error: {}", CodeEnum.C404.getMsg());
+				return ResponseVo.build(CodeEnum.C404);
+			}
+		}
+		logger.error("/error: {}", CodeEnum.C500.getMsg());
+		return ResponseVo.build(CodeEnum.C500);
+	}
+
+	
+	@Override
+	public String getErrorPath() {
+		return "/error";
+	}
+	
+}

+ 81 - 0
src/main/java/com/llisoft/service/file/config/ExceptionConfig.java

@@ -0,0 +1,81 @@
+package com.llisoft.service.file.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.llisoft.common.constant.CodeEnum;
+import com.llisoft.common.exception.MtaException;
+import com.llisoft.common.vo.ResponseVo;
+
+/**
+ * 统一处理业务异常 controller
+ * @author YangJie [2018年12月26日]
+ */
+@ControllerAdvice
+public class ExceptionConfig {
+	
+	private Logger logger = LoggerFactory.getLogger(ExceptionConfig.class);
+	
+
+    /**
+     * 入参空
+     * @param exception
+     * @return
+     */
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    public @ResponseBody ResponseVo<String> exception(HttpMessageNotReadableException exception){
+    	logger.warn("入参异常", exception);
+        return ResponseVo.build(CodeEnum.C400);
+    }
+    
+    /**
+     * 入参检验失败
+     * @param exception
+     * @return
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public @ResponseBody ResponseVo<String> exception(MethodArgumentNotValidException exception){
+    	logger.warn("入参异常", exception);
+    	return ResponseVo.build(CodeEnum.C400.getCode(), exception.getBindingResult().getFieldError().getDefaultMessage());
+    }
+    
+    /**
+     * 无权访问
+     * @param exception
+     * @return
+     */
+    @ExceptionHandler(AccessDeniedException.class)
+    public @ResponseBody ResponseVo<String> exception(AccessDeniedException exception){
+    	logger.warn("无权访问", exception);
+    	return ResponseVo.build(CodeEnum.C403);
+    }
+	
+    /**
+     * 业务异常
+     * @param exception
+     * @return
+     */
+    @ExceptionHandler(MtaException.class)
+    public @ResponseBody ResponseVo<String> exception(MtaException exception){
+    	logger.warn("业务异常", exception);
+    	return ResponseVo.build(CodeEnum.FAIL.getCode(), exception.getMessage());
+    }
+    
+    /**
+     * 默认异常
+     * @param exception
+     * @return
+     */
+    @ExceptionHandler(Exception.class)
+    public @ResponseBody ResponseVo<String> exception(Exception exception){
+    	logger.error("服务异常", exception);
+    	return ResponseVo.build(CodeEnum.C500);
+    }
+    
+}

+ 27 - 0
src/main/java/com/llisoft/service/file/config/SpringMvcConfig.java

@@ -0,0 +1,27 @@
+package com.llisoft.service.file.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 配置spring mvc
+ * @author YangJie [2018年12月25日]
+ */
+@Configuration
+public class SpringMvcConfig implements WebMvcConfigurer {
+	
+	@Override // 默认首页
+	public void addViewControllers(ViewControllerRegistry registry) {
+			registry.addRedirectViewController("/", "/swagger-ui.html");
+	}
+
+//	@Override // 跨域配置
+//	public void addCorsMappings(CorsRegistry registry) {
+//    	registry.addMapping("/**")
+//	        .allowedOrigins("*")
+//	        .allowedHeaders("*")
+//	        .allowedMethods("POST", "OPTIONS");
+//	}
+	
+}

+ 36 - 0
src/main/java/com/llisoft/service/file/config/SpringRedisConfig.java

@@ -0,0 +1,36 @@
+package com.llisoft.service.file.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+
+/**
+ * Redis配置
+ * @author YangJie [2018年12月26日]
+ */
+@Configuration
+@EnableCaching // 开启缓存
+public class SpringRedisConfig extends CachingConfigurerSupport{
+	
+	@Autowired // 此对象有springboot自动创建
+	private RedisConnectionFactory redisConnectionFactory;
+
+	/**
+	 * 默认序列化方式为 #JdkSerializationRedisSerializer
+	 * 如要使用json需要将序列化方式改为 #GenericJackson2JsonRedisSerializer
+	 */
+	@Override
+	public CacheManager cacheManager() {
+		RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
+		config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
+		return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
+	}
+	
+}

+ 15 - 0
src/main/java/com/llisoft/service/file/config/SpringSecurityConfig.java

@@ -0,0 +1,15 @@
+package com.llisoft.service.file.config;
+
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+/**
+ * 安全配置
+ * @author YangJie [2019年1月23日]
+ */
+@EnableWebSecurity
+public class SpringSecurityConfig extends WebSecurityConfigurerAdapter{
+
+
+	
+}

+ 52 - 0
src/main/java/com/llisoft/service/file/config/SwaggerConfig.java

@@ -0,0 +1,52 @@
+package com.llisoft.service.file.config;
+
+import java.util.Arrays;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.google.common.base.Predicates;
+import com.llisoft.common.constant.Constant;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * swagger配置
+ * @author YangJie [2018年12月25日]
+ */
+@Configuration
+@EnableSwagger2 // 启用swagger
+@ConditionalOnProperty(name="mta.debug", havingValue="true") // 仅开发启用
+public class SwaggerConfig {
+
+	@Bean  
+	public Docket docket() {  
+		return new Docket(DocumentationType.SWAGGER_2)
+			.apiInfo(new ApiInfoBuilder().title("文件服务API").version("v1.0.0").build())
+			.directModelSubstitute(byte.class, int.class) //修正byte转string的Bug
+			.globalOperationParameters( // header
+					Arrays.asList(
+						new ParameterBuilder()
+						.parameterType("header")
+						.name(Constant.HEADER_KEY_TOKEN)
+						.description("token")
+						.modelRef(new ModelRef("string"))
+						.required(false)
+						.build()
+					)
+				)
+			.select()
+			// 文档中需要屏蔽的接口
+			.paths(Predicates.not(PathSelectors.regex("/error.*")))
+			.paths(Predicates.not(PathSelectors.regex("/actuator.*")))
+			.build();
+	}  
+	
+}

+ 39 - 0
src/main/java/com/llisoft/service/file/controller/FileController.java

@@ -0,0 +1,39 @@
+package com.llisoft.service.file.controller;
+
+import javax.validation.Valid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.llisoft.service.file.service.OssService;
+import com.llisoft.service.file.vo.RequestUploadVo;
+import com.llisoft.service.file.vo.ResponseUploadVo;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@Api(tags="文件接口")
+@RestController
+@RequestMapping("/file")
+public class FileController {
+	
+	@Autowired
+	private OssService ossService;
+	
+	
+	@ApiOperation(value="上传")
+	@PostMapping("/upload")
+	public ResponseUploadVo upload(@Valid @RequestBody RequestUploadVo uploadVo) throws Exception{
+		return ossService.upload(uploadVo.getPrefix(), uploadVo.getSuffix());
+	}
+	
+	@ApiOperation(value="下载")
+	@PostMapping("/download")
+	public String download(String key) throws Exception{
+		return ossService.download(key);
+	}
+	
+}

+ 105 - 0
src/main/java/com/llisoft/service/file/service/OssService.java

@@ -0,0 +1,105 @@
+package com.llisoft.service.file.service;
+
+import java.net.URL;
+import java.util.Date;
+import java.util.Objects;
+import java.util.UUID;
+
+import javax.annotation.PostConstruct;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import com.aliyun.oss.ClientConfiguration;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.common.auth.DefaultCredentialProvider;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.model.MatchMode;
+import com.aliyun.oss.model.PolicyConditions;
+import com.llisoft.service.file.vo.ResponseUploadVo;
+
+/**
+ * 阿里云OSS接口调用
+ * @author YangJie [2019年2月18日]
+ */
+@Service
+public class OssService {
+	
+	private Logger logger = LoggerFactory.getLogger(OssService.class);
+	
+	@Value("${mta.debug}")
+	private boolean debug;
+	
+	@Value("${oss.endpoint}")
+	private String endpoint;
+	@Value("${oss.accessKeyId}")
+	private String accessKeyId;
+	@Value("${oss.accessKeySecret}")
+	private String accessKeySecret;
+	@Value("${oss.private.bucket}")
+	private String privateBucket;
+	@Value("${oss.public.bucket}")
+	private String publicBucket;
+	@Value("${oss.public.domain}")
+	private String publicDomain;
+	
+	
+	// OSS客户端
+	private OSSClient ossClient;
+	
+	@PostConstruct
+	public void init() {
+		ossClient = new OSSClient(endpoint,new DefaultCredentialProvider(accessKeyId, accessKeySecret), new ClientConfiguration());
+	}
+
+	/**
+	 * 上传
+	 * @return
+	 * @throws Exception 
+	 */
+	public ResponseUploadVo upload(String prefix, String suffix) throws Exception {
+		prefix = debug ? "test/" + prefix : prefix; // 测试环境下添加固定前缀, 定时清理
+		PolicyConditions policyConditions = new PolicyConditions();
+		policyConditions.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1024*1024*1024*1); // 内容长度范围1G
+		policyConditions.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, prefix); // key前缀
+		String postPolicy = ossClient.generatePostPolicy(this.getExpiration(10), policyConditions);
+		String encodedPolicy = BinaryUtil.toBase64String(postPolicy.getBytes("utf-8"));
+		String postSignature = ossClient.calculatePostSignature(postPolicy);
+		ResponseUploadVo uploadBean = new ResponseUploadVo();
+		uploadBean.setKey(prefix + UUID.randomUUID().toString().replace("-", "") + suffix);
+		uploadBean.setAccessid(accessKeyId);
+		uploadBean.setPolicy(encodedPolicy);
+		uploadBean.setSignature(postSignature);
+		uploadBean.setUrl(publicDomain);
+		return uploadBean;
+	}
+	
+	/**
+	 * 下载
+	 * @param key
+	 * @return
+	 */
+	public String download(String key) {
+		logger.info("oss下载请求: {}", key);
+		if(Objects.isNull(key) || key.trim().isEmpty()) {
+			return null;
+		}
+		URL url = ossClient.generatePresignedUrl(publicBucket, key, this.getExpiration(30)); // 授权有效期30分钟
+		String result = url.toString();
+		logger.info("oss下载返回: {}", result);
+		return result;
+	}
+
+	/**
+	 * 获取有效期
+	 * @param minute 分钟
+	 * @return
+	 */
+	private Date getExpiration(int minute) {
+		return new Date(System.currentTimeMillis() + 1000*60*minute);
+	}
+	
+	
+}

+ 103 - 0
src/main/java/com/llisoft/service/file/util/RedisUtil.java

@@ -0,0 +1,103 @@
+package com.llisoft.service.file.util;
+
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import com.llisoft.common.util.JsonUtil;
+
+/**
+ * redis处理
+ * @author YangJie [2018年12月26日]
+ */
+@Component
+public class RedisUtil {
+	
+    private static StringRedisTemplate redisTemplate;
+    
+    @Autowired
+    public RedisUtil(StringRedisTemplate redisTemplate) {
+    	RedisUtil.redisTemplate = redisTemplate;
+    }
+    
+	
+	/**
+	 * 获取
+	 * @param key
+	 * @return
+	 */
+    public static String get(String key) {
+        return Objects.isNull(key) ? null : redisTemplate.opsForValue().get(key);
+    }
+	
+    /**
+     * 获取
+     * @param key
+     * @param clazz 目标对象类型
+     * @return
+     */
+    public static <T> T get(String key, Class<T> clazz) {
+    	String value = get(key);
+        return Objects.isNull(value) ? null : JsonUtil.toObject(value, clazz);
+    }
+    
+    /**
+     * 通过正则获取列表
+     * @param pattern
+     * @return
+     */
+    public static Set<String> gets(String pattern) {
+    	return redisTemplate.keys(pattern);
+    }
+    
+    /**
+     * 获取与 key 对应的对象
+     * @param key
+     * @param clazz 目标对象类型
+     * @return
+     */
+    public static long getExpire(String key) {
+    	return redisTemplate.getExpire(key);
+    }
+    
+    /**
+     * 保存
+     * @param key
+     * @param obj
+     */
+    public static void set(String key, Object obj) {
+    	redisTemplate.opsForValue().set(key, JsonUtil.toJson(obj));
+    }
+    
+    /**
+     * 保存
+     * @param key
+     * @param obj
+     * @param timeout 超时时间
+     * @param unit 时间单位
+     */
+    public static void set(String key, Object obj, long timeout, TimeUnit unit) {
+    	redisTemplate.opsForValue().set(key, JsonUtil.toJson(obj), timeout, unit);
+    }
+    
+    /**
+     * 删除
+     * @param key
+     */
+    public static void delete(String key) {
+    	redisTemplate.delete(key);
+    }
+    
+    /**
+     * 删除
+     * @param key
+     */
+    public static void deletes(String pattern) {
+    	redisTemplate.delete(gets(pattern));
+    }
+
+}

+ 23 - 0
src/main/java/com/llisoft/service/file/vo/RequestDownloadVo.java

@@ -0,0 +1,23 @@
+package com.llisoft.service.file.vo;
+
+import javax.validation.constraints.NotBlank;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("下载请求实体")
+public class RequestDownloadVo {
+	
+	@ApiModelProperty("KEY")
+	@NotBlank(message="KEY不能为空")
+	private String key;
+
+	public String getKey() {
+		return key;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+	
+}

+ 27 - 0
src/main/java/com/llisoft/service/file/vo/RequestUploadVo.java

@@ -0,0 +1,27 @@
+package com.llisoft.service.file.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("上传请求实体")
+public class RequestUploadVo {
+	
+	@ApiModelProperty("前缀")
+	private String prefix;
+	@ApiModelProperty("后缀")
+	private String suffix;
+	
+	public String getPrefix() {
+		return prefix;
+	}
+	public void setPrefix(String prefix) {
+		this.prefix = prefix;
+	}
+	public String getSuffix() {
+		return suffix;
+	}
+	public void setSuffix(String suffix) {
+		this.suffix = suffix;
+	}
+	
+}

+ 20 - 0
src/main/java/com/llisoft/service/file/vo/ResponseDownloadVo.java

@@ -0,0 +1,20 @@
+package com.llisoft.service.file.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("下载返回实体")
+public class ResponseDownloadVo {
+	
+	@ApiModelProperty("URL")
+	private String url;
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+	
+}

+ 51 - 0
src/main/java/com/llisoft/service/file/vo/ResponseUploadVo.java

@@ -0,0 +1,51 @@
+package com.llisoft.service.file.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("上传返回实体")
+public class ResponseUploadVo {
+	
+	@ApiModelProperty("URL")
+	private String url;
+	@ApiModelProperty("ID")
+	private String accessid;
+	@ApiModelProperty("凭证")
+	private String policy;
+	@ApiModelProperty("签名")
+	private String signature;
+	@ApiModelProperty("key")
+	private String key;
+	
+	public String getAccessid() {
+		return accessid;
+	}
+	public void setAccessid(String accessid) {
+		this.accessid = accessid;
+	}
+	public String getUrl() {
+		return url;
+	}
+	public void setUrl(String url) {
+		this.url = url;
+	}
+	public String getPolicy() {
+		return policy;
+	}
+	public void setPolicy(String policy) {
+		this.policy = policy;
+	}
+	public String getSignature() {
+		return signature;
+	}
+	public void setSignature(String signature) {
+		this.signature = signature;
+	}
+	public String getKey() {
+		return key;
+	}
+	public void setKey(String key) {
+		this.key = key;
+	}
+	
+}

+ 60 - 0
src/main/resources/application.yml

@@ -0,0 +1,60 @@
+##服务配置
+server:
+  port: 8001 #监听端口
+  
+##自定义配置
+mta: 
+  debug: true #是否测试
+  
+##oss配置
+oss: 
+  endpoint: http://oss-cn-beijing.aliyuncs.com
+  accessKeyId: LTAIU5bgB80NSjhq
+  accessKeySecret: I7X0zGCEpMvxhn0MLKkGQ0VPbeY1OP
+  private.bucket: mta-test
+  public.bucket: mta-test
+  public.domain: http://mta-test.oss-cn-beijing.aliyuncs.com
+    
+
+##spring配置
+spring: 
+  ##应用配置 #服务名称
+  application.name: mta_service_file
+  ##监控服务配置
+  boot.admin.client:
+    instance.preferIp: true #使用IP注册
+    url: http://192.168.0.179:1111 #监控服务地址
+  ##redis配置
+  redis: 
+    host: 192.168.0.172
+    port: 6379
+    database: 10
+    password: 
+    timeout: 1000
+    jedis:
+      pool: 
+        minIdle: 0
+        maxIdle: 8
+        maxActive: 8
+        maxWait: -1
+    
+##注册中心配置
+eureka:
+  instance: 
+    preferIpAddress: true #使用ip注册服务
+    ipAddress: localhost #配置ip地址
+    instanceId: ${eureka.instance.ipAddress}:${server.port} #实例显示名称
+  client:
+    healthcheck.enabled: true #开启健康检测
+    serviceUrl.defaultZone: http://192.168.0.179:8761/eureka #配置中心地址
+
+##监控配置    
+management:
+  server.port: 18001 #监控端口
+  endpoints.web.exposure.include: "*" #开启所有端点
+  endpoint.health.show-details: always #显示健康详情
+  
+##日志配置
+logging: 
+  level:
+    com.llisoft.service.file.dao: debug

+ 26 - 0
src/test/java/com/llisoft/service/file/ServiceTest.java

@@ -0,0 +1,26 @@
+package com.llisoft.service.file;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.llisoft.common.util.JsonUtil;
+import com.llisoft.service.file.service.OssService;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class ServiceTest {
+	
+	@Autowired
+	private OssService ossService;
+	
+	@Test
+	public void test() throws Exception{
+		long begin = System.currentTimeMillis();
+		System.out.println(JsonUtil.toJson(ossService.upload("", "")));
+		System.out.println("耗时:"+ (System.currentTimeMillis() - begin));
+	}
+	
+}