From 61d66f7caaa5261ca2f71aa9e76a522ce1b8ed67 Mon Sep 17 00:00:00 2001 From: zhh Date: Thu, 17 May 2018 15:53:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0oss=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mall-admin/pom.xml | 6 ++ .../java/com/macro/mall/config/OssConfig.java | 23 ++++ .../macro/mall/controller/OssController.java | 45 ++++++++ .../com/macro/mall/dto/OssCallbackParam.java | 34 ++++++ .../com/macro/mall/dto/OssCallbackResult.java | 52 +++++++++ .../com/macro/mall/dto/OssPolicyResult.java | 61 +++++++++++ .../com/macro/mall/service/OssService.java | 14 +++ .../mall/service/impl/OssServiceImpl.java | 101 ++++++++++++++++++ .../src/main/resources/application.properties | 13 ++- 9 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 mall-admin/src/main/java/com/macro/mall/config/OssConfig.java create mode 100644 mall-admin/src/main/java/com/macro/mall/controller/OssController.java create mode 100644 mall-admin/src/main/java/com/macro/mall/dto/OssCallbackParam.java create mode 100644 mall-admin/src/main/java/com/macro/mall/dto/OssCallbackResult.java create mode 100644 mall-admin/src/main/java/com/macro/mall/dto/OssPolicyResult.java create mode 100644 mall-admin/src/main/java/com/macro/mall/service/OssService.java create mode 100644 mall-admin/src/main/java/com/macro/mall/service/impl/OssServiceImpl.java diff --git a/mall-admin/pom.xml b/mall-admin/pom.xml index 1ec5454..cbeca9f 100644 --- a/mall-admin/pom.xml +++ b/mall-admin/pom.xml @@ -78,6 +78,12 @@ jjwt 0.9.0 + + + com.aliyun.oss + aliyun-sdk-oss + 2.5.0 + diff --git a/mall-admin/src/main/java/com/macro/mall/config/OssConfig.java b/mall-admin/src/main/java/com/macro/mall/config/OssConfig.java new file mode 100644 index 0000000..d0112a9 --- /dev/null +++ b/mall-admin/src/main/java/com/macro/mall/config/OssConfig.java @@ -0,0 +1,23 @@ +package com.macro.mall.config; + +import com.aliyun.oss.OSSClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Created by macro on 2018/5/17. + */ +@Configuration +public class OssConfig { + @Value("${aliyun.oss.endpoint}") + private String ALIYUN_OSS_ENDPOINT; + @Value("${aliyun.oss.accessKeyId}") + private String ALIYUN_OSS_ACCESSKEYID; + @Value("${aliyun.oss.accessKeySecret}") + private String ALIYUN_OSS_ACCESSKEYSECRET; + @Bean + public OSSClient ossClient(){ + return new OSSClient(ALIYUN_OSS_ENDPOINT,ALIYUN_OSS_ACCESSKEYID,ALIYUN_OSS_ACCESSKEYSECRET); + } +} diff --git a/mall-admin/src/main/java/com/macro/mall/controller/OssController.java b/mall-admin/src/main/java/com/macro/mall/controller/OssController.java new file mode 100644 index 0000000..de4d404 --- /dev/null +++ b/mall-admin/src/main/java/com/macro/mall/controller/OssController.java @@ -0,0 +1,45 @@ +package com.macro.mall.controller; + + +import com.macro.mall.dto.CommonResult; +import com.macro.mall.dto.OssCallbackResult; +import com.macro.mall.dto.OssPolicyResult; +import com.macro.mall.service.impl.OssServiceImpl; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * Oss相关操作接口 + * Created by macro on 2018/4/26. + */ +@Controller +@Api(tags = "OssController",description = "Oss管理") +@RequestMapping("/aliyun/oss") +public class OssController { + @Autowired + private OssServiceImpl ossService; + + @ApiOperation(value = "oss上传签名生成") + @RequestMapping(value = "/policy",method = RequestMethod.GET) + @ResponseBody + public Object policy() { + OssPolicyResult result = ossService.policy(); + return new CommonResult().success(result); + } + + /** + * 上传成功回调方法 + */ + @RequestMapping(value = "callback",method = RequestMethod.POST) + @ResponseBody + public Object callback(HttpServletRequest request) { + OssCallbackResult ossCallbackResult = ossService.callback(request); + return new CommonResult().success(ossCallbackResult); + } + +} diff --git a/mall-admin/src/main/java/com/macro/mall/dto/OssCallbackParam.java b/mall-admin/src/main/java/com/macro/mall/dto/OssCallbackParam.java new file mode 100644 index 0000000..e5f53fe --- /dev/null +++ b/mall-admin/src/main/java/com/macro/mall/dto/OssCallbackParam.java @@ -0,0 +1,34 @@ +package com.macro.mall.dto; + +/** + * Created by macro on 2018/5/17. + */ +public class OssCallbackParam { + private String callbackUrl; + private String callbackBody; + private String callbackBodyType; + + public String getCallbackUrl() { + return callbackUrl; + } + + public void setCallbackUrl(String callbackUrl) { + this.callbackUrl = callbackUrl; + } + + public String getCallbackBody() { + return callbackBody; + } + + public void setCallbackBody(String callbackBody) { + this.callbackBody = callbackBody; + } + + public String getCallbackBodyType() { + return callbackBodyType; + } + + public void setCallbackBodyType(String callbackBodyType) { + this.callbackBodyType = callbackBodyType; + } +} diff --git a/mall-admin/src/main/java/com/macro/mall/dto/OssCallbackResult.java b/mall-admin/src/main/java/com/macro/mall/dto/OssCallbackResult.java new file mode 100644 index 0000000..e3b6783 --- /dev/null +++ b/mall-admin/src/main/java/com/macro/mall/dto/OssCallbackResult.java @@ -0,0 +1,52 @@ +package com.macro.mall.dto; + +/** + * Created by macro on 2018/5/17. + */ +public class OssCallbackResult { + private String filename; + private String size; + private String mimeType; + private String width; + private String height; + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getMimeType() { + return mimeType; + } + + public void setMimeType(String mimeType) { + this.mimeType = mimeType; + } + + public String getWidth() { + return width; + } + + public void setWidth(String width) { + this.width = width; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } +} diff --git a/mall-admin/src/main/java/com/macro/mall/dto/OssPolicyResult.java b/mall-admin/src/main/java/com/macro/mall/dto/OssPolicyResult.java new file mode 100644 index 0000000..5027c36 --- /dev/null +++ b/mall-admin/src/main/java/com/macro/mall/dto/OssPolicyResult.java @@ -0,0 +1,61 @@ +package com.macro.mall.dto; + +/** + * Created by macro on 2018/5/17. + */ +public class OssPolicyResult { + private String accessKeyId; + private String policy; + private String signature; + private String dir; + private String callback; + private String action; + + public String getAccessKeyId() { + return accessKeyId; + } + + public void setAccessKeyId(String accessKeyId) { + this.accessKeyId = accessKeyId; + } + + 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 getDir() { + return dir; + } + + public void setDir(String dir) { + this.dir = dir; + } + + public String getCallback() { + return callback; + } + + public void setCallback(String callback) { + this.callback = callback; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } +} diff --git a/mall-admin/src/main/java/com/macro/mall/service/OssService.java b/mall-admin/src/main/java/com/macro/mall/service/OssService.java new file mode 100644 index 0000000..6b0b699 --- /dev/null +++ b/mall-admin/src/main/java/com/macro/mall/service/OssService.java @@ -0,0 +1,14 @@ +package com.macro.mall.service; + +import com.macro.mall.dto.OssCallbackResult; +import com.macro.mall.dto.OssPolicyResult; + +import javax.servlet.http.HttpServletRequest; + +/** + * Created by macro on 2018/5/17. + */ +public interface OssService { + OssPolicyResult policy(); + OssCallbackResult callback(HttpServletRequest request); +} diff --git a/mall-admin/src/main/java/com/macro/mall/service/impl/OssServiceImpl.java b/mall-admin/src/main/java/com/macro/mall/service/impl/OssServiceImpl.java new file mode 100644 index 0000000..89e32b9 --- /dev/null +++ b/mall-admin/src/main/java/com/macro/mall/service/impl/OssServiceImpl.java @@ -0,0 +1,101 @@ +package com.macro.mall.service.impl; + +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.common.utils.BinaryUtil; +import com.aliyun.oss.model.MatchMode; +import com.aliyun.oss.model.PolicyConditions; +import com.macro.mall.dto.OssCallbackParam; +import com.macro.mall.dto.OssCallbackResult; +import com.macro.mall.dto.OssPolicyResult; +import com.macro.mall.service.OssService; +import com.macro.mall.util.JsonUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created by macro on 2018/5/17. + */ +@Service +public class OssServiceImpl implements OssService { + + private static final Logger LOGGER = LoggerFactory.getLogger(OssServiceImpl.class); + @Value("${aliyun.oss.policy.expire}") + private int ALIYUN_OSS_EXPIRE; + @Value("${aliyun.oss.maxSize}") + private int ALIYUN_OSS_MAX_SIZE; + @Value("${aliyun.oss.callback}") + private String ALIYUN_OSS_CALLBACK; + @Value("${aliyun.oss.bucketName}") + private String ALIYUN_OSS_BUCKET_NAME; + @Value("${aliyun.oss.endpoint}") + private String ALIYUN_OSS_ENDPOINT; + @Value("${aliyun.oss.dir.prefix}") + private String ALIYUN_OSS_DIR_PREFIX; + + @Autowired + private OSSClient ossClient; + + /** + * 签名生成 + */ + @Override + public OssPolicyResult policy() { + OssPolicyResult result = new OssPolicyResult(); + // 存储目录 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + String dir = ALIYUN_OSS_DIR_PREFIX+sdf.format(new Date()); + // 签名有效期 + long expireEndTime = System.currentTimeMillis() + ALIYUN_OSS_EXPIRE * 1000; + Date expiration = new Date(expireEndTime); + // 文件大小 + long maxSize = ALIYUN_OSS_MAX_SIZE * 1024 * 1024; + // 回调 +// OssCallbackParam callback = new OssCallbackParam(); +// callback.setCallbackUrl(ALIYUN_OSS_CALLBACK); +// callback.setCallbackBody("filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}"); +// callback.setCallbackBodyType("application/x-www-form-urlencoded"); + // 提交节点 + String action = "http://" + ALIYUN_OSS_BUCKET_NAME + "." + ALIYUN_OSS_ENDPOINT; + try { + PolicyConditions policyConds = new PolicyConditions(); + policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, maxSize); + policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir); + String postPolicy = ossClient.generatePostPolicy(expiration, policyConds); + byte[] binaryData = postPolicy.getBytes("utf-8"); + String policy = BinaryUtil.toBase64String(binaryData); + String signature = ossClient.calculatePostSignature(postPolicy); +// String callbackData = BinaryUtil.toBase64String(JsonUtil.objectToJson(callback).getBytes("utf-8")); + // 返回结果 + result.setAccessKeyId(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId()); + result.setPolicy(policy); + result.setSignature(signature); + result.setDir(dir); +// result.setCallback(callbackData); + result.setAction(action); + } catch (Exception e) { + LOGGER.error("签名生成失败", e); + } + return result; + } + + @Override + public OssCallbackResult callback(HttpServletRequest request) { + OssCallbackResult result= new OssCallbackResult(); + String filename = request.getParameter("filename"); + filename = "http://".concat(ALIYUN_OSS_BUCKET_NAME).concat(".").concat(ALIYUN_OSS_ENDPOINT).concat("/").concat(filename); + result.setFilename(filename); + result.setSize(request.getParameter("size")); + result.setMimeType(request.getParameter("mimeType")); + result.setWidth(request.getParameter("width")); + result.setHeight(request.getParameter("height")); + return result; + } + +} diff --git a/mall-admin/src/main/resources/application.properties b/mall-admin/src/main/resources/application.properties index b435073..ab830f2 100644 --- a/mall-admin/src/main/resources/application.properties +++ b/mall-admin/src/main/resources/application.properties @@ -36,4 +36,15 @@ jwt.secret=mySecret jwt.expiration=604800 #JWTõͷ jwt.tokenHead=Bearer -#===JWT end=== \ No newline at end of file +#===JWT end=== + +#===OSS start=== +aliyun.oss.endpoint=oss-cn-shenzhen.aliyuncs.com +aliyun.oss.accessKeyId=test +aliyun.oss.accessKeySecret=test +aliyun.oss.bucketName=macro-oss +aliyun.oss.policy.expire=300 +aliyun.oss.maxSize=10 +aliyun.oss.callback=http://localhost:8080/aliyun/oss/callback +aliyun.oss.dir.prefix=mall/images/ +#===OSS end=== \ No newline at end of file