From 626384a24e9021f2ed01ed8d38c6d13b9a141aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E5=B0=8F=E5=A2=A8?= <2291200076@qq.com> Date: Thu, 7 Apr 2022 18:11:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=85=BE=E8=AE=AF=E4=BA=91=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=90=8E=E7=AB=AF=E9=A2=84=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E5=B0=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/plus/bookshelf/App.java | 3 +- .../Common/FileManager/QCloudCosUtils.java | 35 +++++++++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/bookshelfplus/src/main/java/plus/bookshelf/App.java b/bookshelfplus/src/main/java/plus/bookshelf/App.java index e58d5fe..fba5e8b 100644 --- a/bookshelfplus/src/main/java/plus/bookshelf/App.java +++ b/bookshelfplus/src/main/java/plus/bookshelf/App.java @@ -1,5 +1,6 @@ package plus.bookshelf; +import com.qcloud.cos.http.HttpMethodName; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -36,6 +37,6 @@ public class App { @RequestMapping("/cos") public String cos() { QCloudCosUtils QCloudCosUtils = new QCloudCosUtils(qCloudCosConfig); - return QCloudCosUtils.getUrl("mydemo.jpg", 1); + return QCloudCosUtils.getUrl("user-login-token", HttpMethodName.POST, "mydemo.jpg", 5); } } diff --git a/bookshelfplus/src/main/java/plus/bookshelf/Common/FileManager/QCloudCosUtils.java b/bookshelfplus/src/main/java/plus/bookshelf/Common/FileManager/QCloudCosUtils.java index fea8b25..628dbb1 100644 --- a/bookshelfplus/src/main/java/plus/bookshelf/Common/FileManager/QCloudCosUtils.java +++ b/bookshelfplus/src/main/java/plus/bookshelf/Common/FileManager/QCloudCosUtils.java @@ -1,5 +1,6 @@ package plus.bookshelf.Common.FileManager; +import com.aventrix.jnanoid.jnanoid.NanoIdUtils; import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; @@ -14,9 +15,6 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; -/** - * 生成预签名URL - */ public class QCloudCosUtils { QCloudCosConfig qCloudCosConfig; @@ -60,11 +58,23 @@ public class QCloudCosUtils { return new COSClient(cred, clientConfig); } - public String getUrl(String objectKey) { - return getUrl(objectKey, 30); + public String getUrl(String token, String objectKey) { + // 如果不指定失效时间,默认为 30 分钟 + return getUrl(token, HttpMethodName.GET, objectKey, 30); } - public String getUrl(String objectKey, Integer expireMinute) { + /** + * 生成预签名URL + *

+ * refer: https://cloud.tencent.com/document/product/436/35217 + * + * @param token 当前登录用户的 token + * @param httpMethodName 请求的 HTTP 方法,上传请求用 PUT,下载请求用 GET,删除请求用 DELETE + * @param objectKey 文件对象的 key + * @param expireMinute 过期时间 + * @return + */ + public String getUrl(String token, HttpMethodName httpMethodName, String objectKey, Integer expireMinute) { // 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建 // 详细代码参见本页:简单操作 -> 创建 COSClient COSClient cosClient = createCOSClient(); @@ -79,11 +89,16 @@ public class QCloudCosUtils { Date expirationDate = new Date(System.currentTimeMillis() + expireMinute * 60 * 1000); // 填写本次请求的参数,需与实际请求相同,能够防止用户篡改此签名的 HTTP 请求的参数 - Map params = new HashMap(); - params.put("bookshelf", "plus"); + Map params = new HashMap<>(); + params.put("poweredBy", "bookshelf.plus"); + params.put("userToken", token); + + String downloadGUID = NanoIdUtils.randomNanoId(); + params.put("downloadGUID", downloadGUID); // 当次生成下载链接的全局唯一Id + params.put("温馨提示", "您的每一次下载都会被详细记录,请不要试图绕过系统获取文件下载直链,这是违法行为,请自重!"); // 填写本次请求的头部,需与实际请求相同,能够防止用户篡改此签名的 HTTP 请求的头部 - Map headers = new HashMap(); + Map headers = new HashMap<>(); // headers.put("header1", "value1"); // 请求的 HTTP 方法,上传请求用 PUT,下载请求用 GET,删除请求用 DELETE @@ -92,7 +107,7 @@ public class QCloudCosUtils { URL url = cosClient.generatePresignedUrl(bucketName, key, expirationDate, method, headers, params); System.out.println(url.toString()); - // 确认本进程不再使用 cosClient 实例之后,关闭之 + // [TODO] 确认本进程不再使用 cosClient 实例之后,关闭之 cosClient.shutdown(); return url.toString();