瀏覽代碼

fss sign api.

deason 1 年之前
父節點
當前提交
938c376ad5

+ 6 - 3
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/fss/FssService.java

@@ -1,14 +1,15 @@
 package cn.com.qmth.examcloud.support.fss;
 
-import cn.com.qmth.examcloud.support.fss.model.FileInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssFileInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssSignInfo;
 
 import java.io.File;
 
 public interface FssService {
 
-    FileInfo writeFile(String filePath, File file, String md5);
+    FssFileInfo writeFile(String filePath, File file, String md5);
 
-    FileInfo writeFile(String filePath, byte[] bytes, String md5);
+    FssFileInfo writeFile(String filePath, byte[] bytes, String md5);
 
     void readFile(String filePath, File toFile);
 
@@ -20,4 +21,6 @@ public interface FssService {
 
     void refreshFile(String fileUrls);
 
+    FssSignInfo buildSign(String filePath);
+
 }

+ 11 - 5
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/fss/impl/AliyunOssService.java

@@ -4,7 +4,8 @@ import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.support.fss.FssHelper;
 import cn.com.qmth.examcloud.support.fss.FssProperty;
 import cn.com.qmth.examcloud.support.fss.FssService;
-import cn.com.qmth.examcloud.support.fss.model.FileInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssFileInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssSignInfo;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
 import com.aliyun.oss.model.GetObjectRequest;
@@ -38,7 +39,7 @@ public class AliyunOssService implements FssService {
     }
 
     @Override
-    public FileInfo writeFile(String filePath, File file, String md5) {
+    public FssFileInfo writeFile(String filePath, File file, String md5) {
         if (file == null) {
             throw new StatusException("文件不能为空!");
         }
@@ -75,7 +76,7 @@ public class AliyunOssService implements FssService {
         }
 
         filePath = FssProperty.FSS_SEPARATOR + filePath;
-        FileInfo result = new FileInfo();
+        FssFileInfo result = new FssFileInfo();
         result.setFileName(FssHelper.getFileName(filePath));
         result.setFilePath(filePath);
         result.setFileUrl(FssProperty.FSS_URL_PREFIX + filePath);
@@ -83,7 +84,7 @@ public class AliyunOssService implements FssService {
     }
 
     @Override
-    public FileInfo writeFile(String filePath, byte[] bytes, String md5) {
+    public FssFileInfo writeFile(String filePath, byte[] bytes, String md5) {
         if (StringUtils.isNotEmpty(md5)) {
             String realMd5 = FssHelper.getFileMD5(bytes);
 
@@ -110,7 +111,7 @@ public class AliyunOssService implements FssService {
         }
 
         filePath = FssProperty.FSS_SEPARATOR + filePath;
-        FileInfo result = new FileInfo();
+        FssFileInfo result = new FssFileInfo();
         result.setFileName(FssHelper.getFileName(filePath));
         result.setFilePath(filePath);
         result.setFileUrl(FssProperty.FSS_URL_PREFIX + filePath);
@@ -224,6 +225,11 @@ public class AliyunOssService implements FssService {
         }
     }
 
+    @Override
+    public FssSignInfo buildSign(String filePath) {
+        return new FssSignInfo();
+    }
+
     private OSS getClient() {
         try {
             // ClientBuilderConfiguration configuration = new ClientBuilderConfiguration();

+ 11 - 5
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/fss/impl/TencentCosService.java

@@ -4,7 +4,8 @@ import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.support.fss.FssHelper;
 import cn.com.qmth.examcloud.support.fss.FssProperty;
 import cn.com.qmth.examcloud.support.fss.FssService;
-import cn.com.qmth.examcloud.support.fss.model.FileInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssFileInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssSignInfo;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.ClientConfig;
 import com.qcloud.cos.auth.BasicCOSCredentials;
@@ -29,7 +30,7 @@ public class TencentCosService implements FssService {
     private static final Logger log = LoggerFactory.getLogger(TencentCosService.class);
 
     @Override
-    public FileInfo writeFile(String filePath, File file, String md5) {
+    public FssFileInfo writeFile(String filePath, File file, String md5) {
         if (file == null) {
             throw new StatusException("文件不能为空!");
         }
@@ -66,7 +67,7 @@ public class TencentCosService implements FssService {
         }
 
         filePath = FssProperty.FSS_SEPARATOR + filePath;
-        FileInfo result = new FileInfo();
+        FssFileInfo result = new FssFileInfo();
         result.setFileName(FssHelper.getFileName(filePath));
         result.setFilePath(filePath);
         result.setFileUrl(FssProperty.FSS_URL_PREFIX + filePath);
@@ -74,7 +75,7 @@ public class TencentCosService implements FssService {
     }
 
     @Override
-    public FileInfo writeFile(String filePath, byte[] bytes, String md5) {
+    public FssFileInfo writeFile(String filePath, byte[] bytes, String md5) {
         if (StringUtils.isNotEmpty(md5)) {
             String realMd5 = FssHelper.getFileMD5(bytes);
             if (!md5.equals(realMd5)) {
@@ -103,7 +104,7 @@ public class TencentCosService implements FssService {
         }
 
         filePath = FssProperty.FSS_SEPARATOR + filePath;
-        FileInfo result = new FileInfo();
+        FssFileInfo result = new FssFileInfo();
         result.setFileName(FssHelper.getFileName(filePath));
         result.setFilePath(filePath);
         result.setFileUrl(FssProperty.FSS_URL_PREFIX + filePath);
@@ -196,6 +197,11 @@ public class TencentCosService implements FssService {
         // @see https://cloud.tencent.com/document/product/436/45597
     }
 
+    @Override
+    public FssSignInfo buildSign(String filePath) {
+        return new FssSignInfo();
+    }
+
     private COSClient getClient() {
         try {
             Region region = new Region(FssProperty.FSS_REGION_ID);

+ 7 - 7
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/fss/model/FileInfo.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/fss/model/FssFileInfo.java

@@ -2,11 +2,17 @@ package cn.com.qmth.examcloud.support.fss.model;
 
 import io.swagger.annotations.ApiModelProperty;
 
-public class FileInfo {
+public class FssFileInfo {
 
     @ApiModelProperty(value = "文件名")
     private String fileName;
 
+    @ApiModelProperty(value = "文件存储路径")
+    private String filePath;
+
+    @ApiModelProperty(value = "文件访问地址")
+    private String fileUrl;
+
     // @ApiModelProperty(value = "文件后缀名")
     // private String fileSuffix;
 
@@ -16,12 +22,6 @@ public class FileInfo {
     // @ApiModelProperty(value = "文件大小KB")
     // private Long fileSize;
 
-    @ApiModelProperty(value = "文件存储路径")
-    private String filePath;
-
-    @ApiModelProperty(value = "文件访问地址")
-    private String fileUrl;
-
     public String getFileName() {
         return fileName;
     }

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

@@ -0,0 +1,64 @@
+package cn.com.qmth.examcloud.support.fss.model;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Map;
+
+public class FssSignInfo {
+
+    @ApiModelProperty("文件存储类型")
+    private String fsType;
+
+    @ApiModelProperty("文件存储-上传请求地址,支持POST")
+    private String formUrl;
+
+    @ApiModelProperty("文件存储-上传请求签名信息")
+    private String signIdentifier;
+
+    @ApiModelProperty("文件存储-上传请求表单参数列表,其中上传文件的参数名为file")
+    private Map<String, String> formParams;
+
+    @ApiModelProperty("文件存储-当前文件的访问地址")
+    private String accessUrl;
+
+    public String getFsType() {
+        return fsType;
+    }
+
+    public void setFsType(String fsType) {
+        this.fsType = fsType;
+    }
+
+    public String getFormUrl() {
+        return formUrl;
+    }
+
+    public void setFormUrl(String formUrl) {
+        this.formUrl = formUrl;
+    }
+
+    public String getSignIdentifier() {
+        return signIdentifier;
+    }
+
+    public void setSignIdentifier(String signIdentifier) {
+        this.signIdentifier = signIdentifier;
+    }
+
+    public Map<String, String> getFormParams() {
+        return formParams;
+    }
+
+    public void setFormParams(Map<String, String> formParams) {
+        this.formParams = formParams;
+    }
+
+    public String getAccessUrl() {
+        return accessUrl;
+    }
+
+    public void setAccessUrl(String accessUrl) {
+        this.accessUrl = accessUrl;
+    }
+
+}

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

@@ -5,7 +5,7 @@ public enum FssType {
     /**
      * 本地存储
      */
-    LOCAL,
+    // LOCAL,
 
     /**
      * 阿里云OSS

+ 64 - 0
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/util/FileUtil.java

@@ -0,0 +1,64 @@
+package cn.com.qmth.examcloud.support.util;
+
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class FileUtil {
+
+    /**
+     * 将网络文件保存到本地
+     *
+     * @param fileUrl   网络文件URL
+     * @param localFile 本地文件对象
+     * @throws IOException
+     */
+    public static void saveUrlAs(String fileUrl, File localFile) {
+        if (StringUtils.isBlank(fileUrl)) {
+            throw new StatusException("500", "文件链接为空");
+        }
+        if (!fileUrl.toLowerCase().startsWith("http") && !fileUrl.toLowerCase().startsWith("https")) {
+            throw new StatusException("500", "文件链接不是URL");
+        }
+        try {
+            saveUrlAs(fileUrl, localFile.getAbsolutePath());
+        } catch (IOException e) {
+            throw new StatusException("5001", "下载文件出错", e);
+        }
+    }
+
+    /**
+     * 将网络文件保存到本地
+     *
+     * @param fileUrl       网络文件URL
+     * @param localFilePath 例如D:/123.txt
+     * @throws IOException
+     */
+    private static void saveUrlAs(String fileUrl, String localFilePath) throws IOException {
+        URL url = new URL(fileUrl);
+
+        HttpURLConnection connection;
+        connection = (HttpURLConnection) url.openConnection();
+
+        try (DataInputStream dataInputStream = new DataInputStream(connection.getInputStream());
+                FileOutputStream fileOutputStream = new FileOutputStream(localFilePath);
+                DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);) {
+
+            byte[] buffer = new byte[4096];
+            int count;
+            while ((count = dataInputStream.read(buffer)) > 0) {
+                dataOutputStream.write(buffer, 0, count);
+            }
+            fileOutputStream.flush();
+            dataOutputStream.flush();
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+    }
+
+}

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

@@ -5,7 +5,7 @@ import cn.com.qmth.examcloud.support.fss.FssFactory;
 import cn.com.qmth.examcloud.support.fss.FssHelper;
 import cn.com.qmth.examcloud.support.fss.FssProperty;
 import cn.com.qmth.examcloud.support.fss.FssService;
-import cn.com.qmth.examcloud.support.fss.model.FileInfo;
+import cn.com.qmth.examcloud.support.fss.model.FssFileInfo;
 import cn.com.qmth.examcloud.support.fss.model.FssType;
 import org.apache.commons.io.IOUtils;
 import org.apache.logging.log4j.Level;
@@ -53,7 +53,7 @@ public class OssClientTest {
         FssService fssService = FssFactory.getInstance(false);
         // FileInfo result = fssService.writeFile(filePath, testFile, fileMd5);
         byte[] testBytes = IOUtils.toByteArray(Files.newInputStream(testFile.toPath()));
-        FileInfo result = fssService.writeFile(filePath, testBytes, fileMd5);
+        FssFileInfo result = fssService.writeFile(filePath, testBytes, fileMd5);
         System.out.println(result.getFileUrl());
 
         File toFile = new File(testDir + "/abc-new.png");