WANG hace 5 años
padre
commit
1ab1c2e8d4

+ 36 - 19
src/main/java/cn/com/qmth/examcloud/web/upyun/UpYunClient.java

@@ -10,6 +10,7 @@ import java.security.SignatureException;
 import java.text.SimpleDateFormat;
 import java.util.Base64;
 import java.util.Calendar;
+import java.util.Date;
 import java.util.Locale;
 import java.util.Map;
 import java.util.TimeZone;
@@ -20,6 +21,7 @@ import javax.crypto.spec.SecretKeySpec;
 
 import org.apache.commons.compress.utils.IOUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
 import org.apache.http.HttpStatus;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -37,6 +39,7 @@ import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
 import cn.com.qmth.examcloud.commons.util.MD5;
 
 /**
@@ -71,6 +74,8 @@ public class UpYunClient {
 
 	private static final String MKDIR = "mkdir";
 
+	private final String METHOD_POST = "POST";
+
 	private final String METHOD_PUT = "PUT";
 
 	private final String METHOD_DELETE = "DELETE";
@@ -117,50 +122,62 @@ public class UpYunClient {
 	}
 
 	/**
-	 * 创建又拍云签名
+	 * 创建又拍云请求
 	 *
 	 * @author WANGWEI
 	 * @param filePath
 	 * @return
 	 */
-	public UpYunSign buildUpYunSign(String filePath) {
-		return buildUpYunSign(filePath, "");
+	public UpYunHttpRequest buildUpYunHttpRequest(String filePath) {
+		return buildUpYunHttpRequest(filePath, "");
 	}
 
 	/**
-	 * 创建又拍云签名
+	 * 创建又拍云请求
 	 *
 	 * @author WANGWEI
 	 * @param filePath
 	 * @param md5
 	 * @return
 	 */
-	public UpYunSign buildUpYunSign(String filePath, String md5) {
-		String path = formatPath(filePath);
-		String uploadUrl = "https://" + API_DOMAIN + path;
-
-		Map<String, String> headers = Maps.newHashMap();
+	public UpYunHttpRequest buildUpYunHttpRequest(String filePath, String md5) {
+		String path = filePath.trim();
+		if (!path.startsWith(SEPARATOR)) {
+			path = SEPARATOR + path;
+		}
+		String formUrl = "https://" + API_DOMAIN + "/" + this.bucketName;
 		String date = getDate();
+
+		Map<String, Object> policyArgs = Maps.newHashMap();
+		policyArgs.put("bucket", bucketName);
+		policyArgs.put("save-key", path);
+		Date expiration = DateUtils.addSeconds(new Date(), 120);
+		policyArgs.put("expiration", expiration.getTime() / 1000);
+		policyArgs.put("date", date);
+		policyArgs.put("content-md5", md5);
+
+		String json = JsonUtil.toJson(policyArgs);
+		String policy = Base64.getEncoder().encodeToString(json.getBytes());
+
+		Map<String, String> params = Maps.newHashMap();
+
 		String authorization = null;
 		try {
 			md5 = null == md5 ? "" : md5;
-			authorization = sign(userName, md5Password, METHOD_PUT, path, date, "", md5);
+			authorization = sign(userName, md5Password, METHOD_POST, path, date, policy, md5);
 		} catch (Exception e) {
 			throw new StatusException("100005", "[upyun]. fail to build sign", e);
 		}
-		headers.put(AUTHORIZATION, authorization);
-		headers.put(DATE, date);
-		headers.put(MKDIR, "true");
-		if (StringUtils.isNotBlank(md5)) {
-			headers.put("Content-MD5", md5);
-		}
+
+		params.put("authorization", authorization);
+		params.put("policy", policy);
 
 		String accessUrl = this.domain + filePath;
 
-		UpYunSign sign = new UpYunSign();
-		sign.setUploadUrl(uploadUrl);
+		UpYunHttpRequest sign = new UpYunHttpRequest();
 		sign.setAccessUrl(accessUrl);
-		sign.setHeaders(headers);
+		sign.setFormParams(params);
+		sign.setFormUrl(formUrl);
 
 		return sign;
 	}

+ 41 - 0
src/main/java/cn/com/qmth/examcloud/web/upyun/UpYunHttpRequest.java

@@ -0,0 +1,41 @@
+package cn.com.qmth.examcloud.web.upyun;
+
+import java.util.Map;
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+
+public class UpYunHttpRequest implements JsonSerializable {
+
+	private static final long serialVersionUID = -1039684070963660489L;
+
+	private String accessUrl;
+
+	private String formUrl;
+
+	private Map<String, String> formParams;
+
+	public String getAccessUrl() {
+		return accessUrl;
+	}
+
+	public void setAccessUrl(String accessUrl) {
+		this.accessUrl = accessUrl;
+	}
+
+	public String getFormUrl() {
+		return formUrl;
+	}
+
+	public void setFormUrl(String formUrl) {
+		this.formUrl = formUrl;
+	}
+
+	public Map<String, String> getFormParams() {
+		return formParams;
+	}
+
+	public void setFormParams(Map<String, String> formParams) {
+		this.formParams = formParams;
+	}
+
+}

+ 0 - 41
src/main/java/cn/com/qmth/examcloud/web/upyun/UpYunSign.java

@@ -1,41 +0,0 @@
-package cn.com.qmth.examcloud.web.upyun;
-
-import java.util.Map;
-
-import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
-
-public class UpYunSign implements JsonSerializable {
-
-	private static final long serialVersionUID = -1039684070963660489L;
-
-	private String uploadUrl;
-
-	private String accessUrl;
-
-	private Map<String, String> headers;
-
-	public String getUploadUrl() {
-		return uploadUrl;
-	}
-
-	public void setUploadUrl(String uploadUrl) {
-		this.uploadUrl = uploadUrl;
-	}
-
-	public String getAccessUrl() {
-		return accessUrl;
-	}
-
-	public void setAccessUrl(String accessUrl) {
-		this.accessUrl = accessUrl;
-	}
-
-	public Map<String, String> getHeaders() {
-		return headers;
-	}
-
-	public void setHeaders(Map<String, String> headers) {
-		this.headers = headers;
-	}
-
-}

+ 2 - 2
src/main/java/cn/com/qmth/examcloud/web/upyun/UpyunService.java

@@ -48,13 +48,13 @@ public interface UpyunService {
 	void delete(String siteId, String filePath);
 
 	/**
-	 * 创建签名
+	 * 创建http请求
 	 *
 	 * @author WANGWEI
 	 * @param filePath
 	 * @param withMd5
 	 * @return
 	 */
-	UpYunSign buildUpYunSign(String siteId, UpyunPathEnvironmentInfo env, String md5);
+	UpYunHttpRequest buildUpYunHttpRequest(String siteId, UpyunPathEnvironmentInfo env, String md5);
 
 }

+ 3 - 3
src/main/java/cn/com/qmth/examcloud/web/upyun/UpyunServiceImpl.java

@@ -59,7 +59,7 @@ public class UpyunServiceImpl implements UpyunService {
 	}
 
 	@Override
-	public UpYunSign buildUpYunSign(String siteId, UpyunPathEnvironmentInfo env, String md5) {
+	public UpYunHttpRequest buildUpYunHttpRequest(String siteId, UpyunPathEnvironmentInfo env, String md5) {
 
 		env.setTimeMillis(String.valueOf(System.currentTimeMillis()));
 
@@ -67,8 +67,8 @@ public class UpyunServiceImpl implements UpyunService {
 		UpYunClient upYunClient = UpyunSiteManager.getUpYunClientByUpyunId(upyunSite.getUpyunId());
 
 		String path = FreeMarkerUtil.process(upyunSite.getPath(), env);
-		UpYunSign sign = upYunClient.buildUpYunSign(path, md5);
-		return sign;
+		UpYunHttpRequest request = upYunClient.buildUpYunHttpRequest(path, md5);
+		return request;
 	}
 
 }