浏览代码

fss sign api.

deason 1 年之前
父节点
当前提交
fe1d739d41

+ 41 - 3
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/fss/impl/AliyunOssService.java

@@ -1,13 +1,17 @@
 package cn.com.qmth.examcloud.support.fss.impl;
 package cn.com.qmth.examcloud.support.fss.impl;
 
 
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.DateUtil;
 import cn.com.qmth.examcloud.support.fss.FssHelper;
 import cn.com.qmth.examcloud.support.fss.FssHelper;
 import cn.com.qmth.examcloud.support.fss.FssProperty;
 import cn.com.qmth.examcloud.support.fss.FssProperty;
 import cn.com.qmth.examcloud.support.fss.FssService;
 import cn.com.qmth.examcloud.support.fss.FssService;
 import cn.com.qmth.examcloud.support.fss.model.FssFileInfo;
 import cn.com.qmth.examcloud.support.fss.model.FssFileInfo;
 import cn.com.qmth.examcloud.support.fss.model.FssSignInfo;
 import cn.com.qmth.examcloud.support.fss.model.FssSignInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssType;
+import com.aliyun.oss.ClientBuilderConfiguration;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
 import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.common.auth.ServiceSignature;
 import com.aliyun.oss.model.GetObjectRequest;
 import com.aliyun.oss.model.GetObjectRequest;
 import com.aliyun.oss.model.OSSObject;
 import com.aliyun.oss.model.OSSObject;
 import com.aliyuncs.DefaultAcsClient;
 import com.aliyuncs.DefaultAcsClient;
@@ -16,6 +20,7 @@ import com.aliyuncs.cdn.model.v20180510.RefreshObjectCachesRequest;
 import com.aliyuncs.cdn.model.v20180510.RefreshObjectCachesResponse;
 import com.aliyuncs.cdn.model.v20180510.RefreshObjectCachesResponse;
 import com.aliyuncs.profile.DefaultProfile;
 import com.aliyuncs.profile.DefaultProfile;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 
 
@@ -23,6 +28,10 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.File;
 import java.io.InputStream;
 import java.io.InputStream;
+import java.util.Base64;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 
 public class AliyunOssService implements FssService {
 public class AliyunOssService implements FssService {
 
 
@@ -227,16 +236,45 @@ public class AliyunOssService implements FssService {
 
 
     @Override
     @Override
     public FssSignInfo buildSign(String filePath) {
     public FssSignInfo buildSign(String filePath) {
-        return new FssSignInfo();
+        filePath = this.fixOssFilePath(filePath);
+        String fileUrl = FssProperty.FSS_URL_PREFIX + "/" + filePath;
+
+        // 示例:https://{bucket}.oss-cn-shenzhen.aliyuncs.com
+        String requestUrl = FssProperty.FSS_ENDPOINT.replace(FssProperty.FSS_REGION_ID,
+                FssProperty.FSS_BUCKET + "." + FssProperty.FSS_REGION_ID);
+
+        Map<String, String> params = new HashMap<>();
+        params.put("key", filePath);
+        params.put("OSSAccessKeyId", FssProperty.FSS_ACCESS_KEY_ID);
+
+        long maxFileSize = 100L * 1024L * 1024L;
+        Date expireDate = DateUtils.addMinutes(new Date(), 10);
+        String expiration = DateUtil.format(expireDate, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+        String policy = String.format("{\"expiration\":\"%s\",\"conditions\":[[\"content-length-range\",0,%s]]}",
+                expiration, maxFileSize);
+        String encodePolicy = Base64.getEncoder().encodeToString(policy.getBytes());
+        params.put("policy", encodePolicy);
+
+        String signature = ServiceSignature.create().computeSignature(FssProperty.FSS_ACCESS_KEY_SECRET, encodePolicy);
+        params.put("Signature", signature);
+
+        FssSignInfo info = new FssSignInfo();
+        info.setFsType(FssType.ALIYUN_OSS.name());
+        info.setSignIdentifier(String.valueOf(System.currentTimeMillis()));
+        info.setFormParams(params);
+        info.setFormUrl(requestUrl);
+        info.setAccessUrl(fileUrl);
+        return info;
     }
     }
 
 
     private OSS getClient() {
     private OSS getClient() {
         try {
         try {
-            // ClientBuilderConfiguration configuration = new ClientBuilderConfiguration();
+            ClientBuilderConfiguration configuration = new ClientBuilderConfiguration();
+            configuration.setMaxErrorRetry(1);
 
 
             OSS client = new OSSClientBuilder().build(
             OSS client = new OSSClientBuilder().build(
                     this.internal ? FssProperty.FSS_INTERNAL_ENDPOINT : FssProperty.FSS_ENDPOINT,
                     this.internal ? FssProperty.FSS_INTERNAL_ENDPOINT : FssProperty.FSS_ENDPOINT,
-                    FssProperty.FSS_ACCESS_KEY_ID, FssProperty.FSS_ACCESS_KEY_SECRET);
+                    FssProperty.FSS_ACCESS_KEY_ID, FssProperty.FSS_ACCESS_KEY_SECRET, configuration);
             // client.setBucketTransferAcceleration(FssProperty.FSS_BUCKET, true);
             // client.setBucketTransferAcceleration(FssProperty.FSS_BUCKET, true);
 
 
             return client;
             return client;

+ 8 - 1
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/fss/impl/TencentCosService.java

@@ -6,6 +6,7 @@ import cn.com.qmth.examcloud.support.fss.FssProperty;
 import cn.com.qmth.examcloud.support.fss.FssService;
 import cn.com.qmth.examcloud.support.fss.FssService;
 import cn.com.qmth.examcloud.support.fss.model.FssFileInfo;
 import cn.com.qmth.examcloud.support.fss.model.FssFileInfo;
 import cn.com.qmth.examcloud.support.fss.model.FssSignInfo;
 import cn.com.qmth.examcloud.support.fss.model.FssSignInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssType;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.ClientConfig;
 import com.qcloud.cos.ClientConfig;
 import com.qcloud.cos.auth.BasicCOSCredentials;
 import com.qcloud.cos.auth.BasicCOSCredentials;
@@ -199,7 +200,12 @@ public class TencentCosService implements FssService {
 
 
     @Override
     @Override
     public FssSignInfo buildSign(String filePath) {
     public FssSignInfo buildSign(String filePath) {
-        return new FssSignInfo();
+        FssSignInfo info = new FssSignInfo();
+        info.setFsType(FssType.TENCENT_COS.name());
+        info.setSignIdentifier(String.valueOf(System.currentTimeMillis()));
+        //todo
+
+        return info;
     }
     }
 
 
     private COSClient getClient() {
     private COSClient getClient() {
@@ -207,6 +213,7 @@ public class TencentCosService implements FssService {
             Region region = new Region(FssProperty.FSS_REGION_ID);
             Region region = new Region(FssProperty.FSS_REGION_ID);
             ClientConfig clientConfig = new ClientConfig(region);
             ClientConfig clientConfig = new ClientConfig(region);
             clientConfig.setHttpProtocol(HttpProtocol.https);
             clientConfig.setHttpProtocol(HttpProtocol.https);
+            clientConfig.setMaxErrorRetry(1);
 
 
             // 同地域的内网访问? COS会智能解析到内网IP
             // 同地域的内网访问? COS会智能解析到内网IP
             // @see https://cloud.tencent.com/document/product/436/56556
             // @see https://cloud.tencent.com/document/product/436/56556

+ 1 - 1
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/fss/model/FssSignInfo.java

@@ -12,7 +12,7 @@ public class FssSignInfo {
     @ApiModelProperty("文件存储-上传请求地址,支持POST")
     @ApiModelProperty("文件存储-上传请求地址,支持POST")
     private String formUrl;
     private String formUrl;
 
 
-    @ApiModelProperty("文件存储-上传请求签名信息")
+    @ApiModelProperty("文件存储-上传请求签名标识")
     private String signIdentifier;
     private String signIdentifier;
 
 
     @ApiModelProperty("文件存储-上传请求表单参数列表,其中上传文件的参数名为file")
     @ApiModelProperty("文件存储-上传请求表单参数列表,其中上传文件的参数名为file")

+ 14 - 1
examcloud-support/src/test/java/cn/com/qmth/examcloud/support/test/OssClientTest.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.examcloud.support.test;
 package cn.com.qmth.examcloud.support.test;
 
 
 import cn.com.qmth.examcloud.commons.util.FileUtil;
 import cn.com.qmth.examcloud.commons.util.FileUtil;
+import cn.com.qmth.examcloud.commons.util.JsonMapper;
 import cn.com.qmth.examcloud.support.fss.FssFactory;
 import cn.com.qmth.examcloud.support.fss.FssFactory;
 import cn.com.qmth.examcloud.support.fss.FssHelper;
 import cn.com.qmth.examcloud.support.fss.FssHelper;
 import cn.com.qmth.examcloud.support.fss.FssProperty;
 import cn.com.qmth.examcloud.support.fss.FssProperty;
@@ -51,7 +52,9 @@ public class OssClientTest {
         final String fileMd5 = "80bf42bd4d12b2a38eff3b32249b17fd";
         final String fileMd5 = "80bf42bd4d12b2a38eff3b32249b17fd";
 
 
         FssService fssService = FssFactory.getInstance(false);
         FssService fssService = FssFactory.getInstance(false);
-        // FileInfo result = fssService.writeFile(filePath, testFile, fileMd5);
+        // System.out.println(new JsonMapper().toJson(fssService.buildSign(filePath)));
+
+        // FssFileInfo result = fssService.writeFile(filePath, testFile, fileMd5);
         byte[] testBytes = IOUtils.toByteArray(Files.newInputStream(testFile.toPath()));
         byte[] testBytes = IOUtils.toByteArray(Files.newInputStream(testFile.toPath()));
         FssFileInfo result = fssService.writeFile(filePath, testBytes, fileMd5);
         FssFileInfo result = fssService.writeFile(filePath, testBytes, fileMd5);
         System.out.println(result.getFileUrl());
         System.out.println(result.getFileUrl());
@@ -70,12 +73,22 @@ public class OssClientTest {
     @Test
     @Test
     public void demoTest2() throws Exception {
     public void demoTest2() throws Exception {
         FssProperty.FSS_URL_PREFIX = "https://ecs-test-static.qmth.com.cn";
         FssProperty.FSS_URL_PREFIX = "https://ecs-test-static.qmth.com.cn";
+
         System.out.println(FssHelper.finalFileUrl("upyun-1://abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("upyun-1://abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("aliyun-1://abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("aliyun-1://abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("aliyun-2://abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("aliyun-2://abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("https://xxx.xxx/abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("https://xxx.xxx/abc/123.jpg"));
+        System.out.println(FssHelper.finalFileUrl("http://127.0.0.1:8080/abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("/abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("/abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("abc/123.jpg"));
         System.out.println(FssHelper.finalFileUrl("abc/123.jpg"));
+
+        System.out.println(FssHelper.fixFilePath("upyun-1://abc/123.jpg"));
+        System.out.println(FssHelper.fixFilePath("aliyun-1://abc/123.jpg"));
+        System.out.println(FssHelper.fixFilePath("aliyun-2://abc/123.jpg"));
+        System.out.println(FssHelper.fixFilePath("https://xxx.xxx/abc/123.jpg"));
+        System.out.println(FssHelper.fixFilePath("http://127.0.0.1:8080/abc/123.jpg"));
+        System.out.println(FssHelper.fixFilePath("/abc/123.jpg"));
+        System.out.println(FssHelper.fixFilePath("abc/123.jpg"));
     }
     }
 
 
 }
 }