Kaynağa Gözat

完成服务器签名web直传并回调

shuzheng 9 yıl önce
ebeveyn
işleme
49093ccee3

+ 13 - 0
zheng-oss/zheng-oss-sdk/src/main/java/com/zheng/oss/common/constant/OssConstant.java

@@ -1,6 +1,7 @@
 package com.zheng.oss.common.constant;
 package com.zheng.oss.common.constant;
 
 
 import com.zheng.common.base.BaseConstants;
 import com.zheng.common.base.BaseConstants;
+import com.zheng.common.util.PropertiesFileUtil;
 
 
 /**
 /**
  * oss系统常量类
  * oss系统常量类
@@ -8,4 +9,16 @@ import com.zheng.common.base.BaseConstants;
  */
  */
 public class OssConstant extends BaseConstants {
 public class OssConstant extends BaseConstants {
 
 
+	// endpoint
+	public static final String ALIYUN_OSS_ENDPOINT = PropertiesFileUtil.getInstance("config").get("aliyun.oss.endpoint");
+
+	// bucketName
+	public static final String ALIYUN_OSS_BUCKET_NAME = PropertiesFileUtil.getInstance("config").get("aliyun.oss.bucketName");
+
+	// 文件大小
+	public static final int ALIYUN_OSS_MAX_SIZE = PropertiesFileUtil.getInstance("config").getInt("aliyun.oss.maxSize");
+
+	// 签名有效期(单位:分钟)
+	public static final int ALIYUN_OSS_EXPIRE = PropertiesFileUtil.getInstance("config").getInt("aliyun.oss.policy.expire");
+
 }
 }

+ 2 - 2
zheng-oss/zheng-oss-sdk/src/main/resources/applicationContext-oss.xml

@@ -6,9 +6,9 @@
 
 
 	<description>zheng-oss-sdk</description>
 	<description>zheng-oss-sdk</description>
 
 
-	<context:property-placeholder location="classpath*:zheng-oss-client.properties"/>
+	<context:property-placeholder location="classpath*:config.properties"/>
 
 
-	<!-- 阿里云OSS客户端 -->
+	<!-- 阿里云OSS -->
 	<bean id="aliyunOssClient" class="com.aliyun.oss.OSSClient">
 	<bean id="aliyunOssClient" class="com.aliyun.oss.OSSClient">
 		<constructor-arg value="${aliyun.oss.endpoint}"/>
 		<constructor-arg value="${aliyun.oss.endpoint}"/>
 		<constructor-arg value="${aliyun.oss.accessKeyId}"/>
 		<constructor-arg value="${aliyun.oss.accessKeyId}"/>

+ 64 - 0
zheng-oss/zheng-oss-web/src/main/java/com/zheng/oss/web/controller/AliyunOssController.java

@@ -0,0 +1,64 @@
+package com.zheng.oss.web.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zheng.oss.common.constant.OssResult;
+import com.zheng.oss.common.constant.OssResultConstant;
+import com.zheng.oss.web.service.AliyunOssService;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.converter.json.MappingJacksonValue;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Created by ZhangShuzheng on 2017/5/15.
+ */
+@Controller
+@RequestMapping("/aliyun/oss")
+public class AliyunOssController {
+
+	private static Logger _log = LoggerFactory.getLogger(AliyunOssController.class);
+
+	@Autowired
+	private AliyunOssService aliyunOssService;
+
+	/**
+	 * 签名生成
+	 * @param callback 跨域请求
+	 * @return
+	 */
+	@GetMapping("/policy")
+	@ResponseBody
+	//@CrossOrigin(origins = "*", methods = RequestMethod.GET) // 该注解不支持JDK1.7
+	public Object policy(@RequestParam(required = false) String callback) {
+		JSONObject result = aliyunOssService.policy();
+		if (StringUtils.isBlank(callback)) {
+			return result;
+		}
+		MappingJacksonValue jsonp = new MappingJacksonValue(result);
+		jsonp.setJsonpFunction(callback);
+		return jsonp;
+	}
+
+	/**
+	 * 上传成功回调方法
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("callback")
+	@ResponseBody
+	public Object callback(HttpServletRequest request) {
+		JSONObject data = new JSONObject();
+		data.put("filename", request.getParameter("filename"));
+		data.put("size", request.getParameter("size"));
+		data.put("mimeType", request.getParameter("mimeType"));
+		data.put("width", request.getParameter("width"));
+		data.put("height", request.getParameter("height"));
+		return new OssResult(OssResultConstant.SUCCESS, data);
+	}
+
+}

+ 13 - 13
zheng-oss/zheng-oss-web/src/main/java/com/zheng/oss/web/controller/DemoController.java

@@ -2,13 +2,14 @@ package com.zheng.oss.web.controller;
 
 
 import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.model.OSSObject;
 import com.aliyun.oss.model.OSSObject;
-import com.aliyun.oss.model.ObjectListing;
 import com.aliyun.oss.model.PutObjectResult;
 import com.aliyun.oss.model.PutObjectResult;
-import com.zheng.common.util.PropertiesFileUtil;
+import com.zheng.oss.common.constant.OssConstant;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 
 import java.io.*;
 import java.io.*;
 
 
@@ -20,29 +21,28 @@ import java.io.*;
 @RequestMapping("/demo")
 @RequestMapping("/demo")
 public class DemoController {
 public class DemoController {
 
 
+    private static Logger _log = LoggerFactory.getLogger(DemoController.class);
+
     @Autowired
     @Autowired
     private OSSClient aliyunOssClient;
     private OSSClient aliyunOssClient;
 
 
-    private String endPoint = PropertiesFileUtil.getInstance("zheng-oss-client").get("aliyun.oss.endpoint");
-    private String bucketName = PropertiesFileUtil.getInstance("zheng-oss-client").get("aliyun.oss.bucketName");
-
     @GetMapping("/aliyun/upload1")
     @GetMapping("/aliyun/upload1")
     public String upload1() {
     public String upload1() {
-        PutObjectResult putObjectResult = aliyunOssClient.putObject(bucketName, "text.txt", new ByteArrayInputStream("Hello OSS".getBytes()));
+        PutObjectResult putObjectResult = aliyunOssClient.putObject(OssConstant.ALIYUN_OSS_BUCKET_NAME, "text.txt", new ByteArrayInputStream("Hello OSS".getBytes()));
         return "success";
         return "success";
     }
     }
 
 
     @GetMapping("/aliyun/upload2")
     @GetMapping("/aliyun/upload2")
     public String upload2() throws FileNotFoundException {
     public String upload2() throws FileNotFoundException {
-        File file = new File("C:\\Users\\shuzheng\\Documents\\zheng.png");
-        PutObjectResult putObjectResult = aliyunOssClient.putObject(bucketName, "file.png", file);
+        File file = new File("d:\\zheng.png");
+        PutObjectResult putObjectResult = aliyunOssClient.putObject(OssConstant.ALIYUN_OSS_BUCKET_NAME, "file.png", file);
         return "success";
         return "success";
     }
     }
 
 
     @GetMapping("/aliyun/download1")
     @GetMapping("/aliyun/download1")
     public String download1() throws IOException {
     public String download1() throws IOException {
         StringBuffer result = new StringBuffer();
         StringBuffer result = new StringBuffer();
-        OSSObject ossObject = aliyunOssClient.getObject(bucketName, "text.txt");
+        OSSObject ossObject = aliyunOssClient.getObject(OssConstant.ALIYUN_OSS_BUCKET_NAME, "text.txt");
         InputStream content = ossObject.getObjectContent();
         InputStream content = ossObject.getObjectContent();
         if (content != null) {
         if (content != null) {
             BufferedReader reader = new BufferedReader(new InputStreamReader(content));
             BufferedReader reader = new BufferedReader(new InputStreamReader(content));
@@ -58,7 +58,7 @@ public class DemoController {
 
 
     @GetMapping("/aliyun/download2")
     @GetMapping("/aliyun/download2")
     public String download2() throws IOException {
     public String download2() throws IOException {
-        return "http://" + bucketName + "." + endPoint + "/file.png";
+        return "http://" + OssConstant.ALIYUN_OSS_BUCKET_NAME + "." + OssConstant.ALIYUN_OSS_ENDPOINT + "/file.png";
     }
     }
 
 
 }
 }

+ 68 - 0
zheng-oss/zheng-oss-web/src/main/java/com/zheng/oss/web/service/AliyunOssService.java

@@ -0,0 +1,68 @@
+package com.zheng.oss.web.service;
+
+import com.alibaba.fastjson.JSONObject;
+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.zheng.oss.common.constant.OssConstant;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created by ZhangShuzheng on 2017/5/15.
+ */
+@Service
+public class AliyunOssService {
+
+	private static Logger _log = LoggerFactory.getLogger(AliyunOssService.class);
+
+	@Autowired
+	private OSSClient aliyunOssClient;
+
+	/**
+	 * 签名生成
+	 * @return
+	 */
+	public JSONObject policy() {
+		JSONObject result = new JSONObject();
+		// 存储目录
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+		String dir = sdf.format(new Date());
+		// 签名有效期
+		long expireEndTime = System.currentTimeMillis() + OssConstant.ALIYUN_OSS_EXPIRE * 1000;
+		Date expiration = new Date(expireEndTime);
+		// 文件大小
+		long maxSize = OssConstant.ALIYUN_OSS_MAX_SIZE * 1024 * 1024;
+		// 回调
+		JSONObject callback = new JSONObject();
+		callback.put("callbackUrl", "http://shuzheng.tunnel.qydev.com/aliyun/oss/callback");
+		callback.put("callbackBody", "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
+		callback.put("callbackBodyType", "application/x-www-form-urlencoded");
+		try {
+			PolicyConditions policyConds = new PolicyConditions();
+			policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, maxSize);
+			policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
+			String postPolicy = aliyunOssClient.generatePostPolicy(expiration, policyConds);
+			byte[] binaryData = postPolicy.getBytes("utf-8");
+			String policy = BinaryUtil.toBase64String(binaryData);
+			String signature = aliyunOssClient.calculatePostSignature(postPolicy);
+			String callbackData = BinaryUtil.toBase64String(callback.toString().getBytes("utf-8"));
+			// 返回结果
+			result.put("OSSAccessKeyId", aliyunOssClient.getCredentialsProvider().getCredentials().getAccessKeyId());
+			result.put("policy", policy);
+			result.put("signature", signature);
+			result.put("dir", dir);
+			result.put("callback", callbackData);
+		} catch (Exception e) {
+			_log.error("签名生成失败", e);
+		}
+		return result;
+	}
+
+}

+ 10 - 1
zheng-oss/zheng-oss-web/src/main/resources/config.properties

@@ -1 +1,10 @@
-env=${profile.env}
+env=${profile.env}
+
+### aliyun oss ###
+aliyun.oss.endpoint=${aliyun.oss.endpoint}
+aliyun.oss.endpoint.internal=${aliyun.oss.endpoint.internal}
+aliyun.oss.accessKeyId=${aliyun.oss.accessKeyId}
+aliyun.oss.accessKeySecret=${aliyun.oss.accessKeySecret}
+aliyun.oss.bucketName=${aliyun.oss.bucketName}
+aliyun.oss.policy.expire=${aliyun.oss.policy.expire}
+aliyun.oss.maxSize=${aliyun.oss.maxSize}

+ 8 - 3
zheng-oss/zheng-oss-web/src/main/resources/profiles/dev.properties

@@ -1,5 +1,10 @@
 profile.env=dev
 profile.env=dev
 
 
-### aliyun ###
-aliyun.oss.endpoint=http://shuzheng.oss-cn-shanghai.aliyuncs.com
-aliyun.oss.endpoint.internal=http://shuzheng.oss-cn-shanghai-internal.aliyuncs.com
+### aliyun oss ###
+aliyun.oss.endpoint=oss-cn-shanghai.aliyuncs.com
+aliyun.oss.endpoint.internal=oss-cn-shanghai-internal.aliyuncs.com
+aliyun.oss.accessKeyId=
+aliyun.oss.accessKeySecret=
+aliyun.oss.bucketName=shuzheng
+aliyun.oss.policy.expire=30
+aliyun.oss.maxSize=10

+ 10 - 1
zheng-oss/zheng-oss-web/src/main/resources/profiles/prod.properties

@@ -1 +1,10 @@
-profile.env=prod
+profile.env=prod
+
+### aliyun oss ###
+aliyun.oss.endpoint=oss-cn-shanghai.aliyuncs.com
+aliyun.oss.endpoint.internal=oss-cn-shanghai-internal.aliyuncs.com
+aliyun.oss.accessKeyId=
+aliyun.oss.accessKeySecret=
+aliyun.oss.bucketName=shuzheng_prod
+aliyun.oss.policy.expire=30
+aliyun.oss.maxSize=10

+ 10 - 1
zheng-oss/zheng-oss-web/src/main/resources/profiles/test.properties

@@ -1 +1,10 @@
-profile.env=test
+profile.env=test
+
+### aliyun oss ###
+aliyun.oss.endpoint=oss-cn-shanghai.aliyuncs.com
+aliyun.oss.endpoint.internal=oss-cn-shanghai-internal.aliyuncs.com
+aliyun.oss.accessKeyId=
+aliyun.oss.accessKeySecret=
+aliyun.oss.bucketName=shuzheng_test
+aliyun.oss.policy.expire=30
+aliyun.oss.maxSize=10

+ 0 - 5
zheng-oss/zheng-oss-web/src/main/resources/zheng-oss-client.properties

@@ -1,5 +0,0 @@
-### aliyun oss ###
-aliyun.oss.endpoint=oss-cn-shanghai.aliyuncs.com
-aliyun.oss.accessKeyId=LTAIf5dDIthJN3h0
-aliyun.oss.accessKeySecret=2IZVHc1Qzxul8rC0ZQGKCEjjnpvm5d
-aliyun.oss.bucketName=shuzheng