腾讯云对象存储原生js上传

1. 获取临时密钥相关信息

 1 // 根据 github 提供的 maven 集成方法导入 java sts sdk,使用 3.1.1 及更高版本
 2 import java.util.TreeMap;
 3 
 4 import com.tencent.cloud.CosStsClient;
 5 import com.tencent.cloud.Policy;
 6 import com.tencent.cloud.Response;
 7 import com.tencent.cloud.Statement;
 8 import com.tencent.cloud.cos.util.Jackson;
 9 
10 public class demo {
11     public static void main(String[] args) {
12         TreeMap<String, Object> config = new TreeMap<String, Object>();
13         try {
14             //这里的 SecretId 和 SecretKey 代表了用于申请临时密钥的永久身份(主账号、子账号等),子账号需要具有操作存储桶的权限。
15             String secretId = System.getenv("secretId");//用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
16             String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
17             // 替换为您的云 api 密钥 SecretId
18             config.put("secretId", secretId);
19             // 替换为您的云 api 密钥 SecretKey
20             config.put("secretKey", secretKey);
21 
22             // 初始化 policy
23             Policy policy = new Policy();
24 
25             // 设置域名:
26             // 如果您使用了腾讯云 cvm,可以设置内部域名
27             //config.put("host", "sts.internal.tencentcloudapi.com");
28 
29             // 临时密钥有效时长,单位是秒,默认 1800 秒,目前主账号最长 2 小时(即 7200 秒),子账号最长 36 小时(即 129600)秒
30             config.put("durationSeconds", 1800);
31             // 换成您的 bucket
32             config.put("bucket", "examplebucket-1250000000");
33             // 换成 bucket 所在地区
34             config.put("region", "ap-chongqing");
35 
36             // 开始构建一条 statement
37             Statement statement = new Statement();
38             // 声明设置的结果是允许操作
39             statement.setEffect("allow");
40             /**
41              * 密钥的权限列表。必须在这里指定本次临时密钥所需要的权限。
42              * 权限列表请参见 https://cloud.tencent.com/document/product/436/31923
43              * 规则为 {project}:{interfaceName}
44              * project : 产品缩写  cos相关授权为值为cos,数据万象(数据处理)相关授权值为ci
45              * 授权所有接口用*表示,例如 cos:*,ci:*
46              * 添加一批操作权限 :
47              */
48             statement.addActions(new String[]{
49                     "cos:PutObject",
50                     // 表单上传、小程序上传
51                     "cos:PostObject",
52                     // 分块上传
53                     "cos:InitiateMultipartUpload",
54                     "cos:ListMultipartUploads",
55                     "cos:ListParts",
56                     "cos:UploadPart",
57                     "cos:CompleteMultipartUpload",
58                     // 处理相关接口一般为数据万象产品 权限中以ci开头
59                     // 创建媒体处理任务
60                     "ci:CreateMediaJobs",
61                     // 文件压缩
62                     "ci:CreateFileProcessJobs"
63             });
64 
65             /**
66              * 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径
67              * 资源表达式规则分对象存储(cos)和数据万象(ci)两种
68              * 数据处理、审核相关接口需要授予ci资源权限
69              *  cos : qcs::cos:{region}:uid/{appid}:{bucket}/{path}
70              *  ci  : qcs::ci:{region}:uid/{appid}:bucket/{bucket}/{path}
71              * 列举几种典型的{path}授权场景:
72              * 1、允许访问所有对象:"*"
73              * 2、允许访问指定的对象:"a/a1.txt", "b/b1.txt"
74              * 3、允许访问指定前缀的对象:"a*", "a/*", "b/*"
75              *  如果填写了“*”,将允许用户访问所有资源;除非业务需要,否则请按照最小权限原则授予用户相应的访问权限范围。
76              *
77              * 示例:授权examplebucket-1250000000 bucket目录下的所有资源给cos和ci 授权两条Resource
78              */
79             statement.addResources(new String[]{
80                     "qcs::cos:ap-chongqing:uid/1250000000:examplebucket-1250000000/*",
81                     "qcs::ci:ap-chongqing:uid/1250000000:bucket/examplebucket-1250000000/*"});
82 
83             // 把一条 statement 添加到 policy
84             // 可以添加多条
85             policy.addStatement(statement);
86             // 将 Policy 示例转化成 String,可以使用任何 json 转化方式,这里是本 SDK 自带的推荐方式
87             config.put("policy", Jackson.toJsonPrettyString(policy));
88 
89             Response response = CosStsClient.getCredential(config);
90             System.out.println(response.credentials.tmpSecretId);
91             System.out.println(response.credentials.tmpSecretKey);
92             System.out.println(response.credentials.sessionToken);
93         } catch (Exception e) {
94             e.printStackTrace();
95             throw new IllegalArgumentException("no valid secret !");
96         }
97     }
98 }

 

2. 构建authorization

 

 1             COSCredentials cred = new BasicSessionCredentials(cosTempCredential.getTmpSecretId(), cosTempCredential.getTmpSecretKey(), cosTempCredential.getSessionToken());
 2             COSSigner cosSigner = new COSSigner();
 3             String key = "/2025/09/11/text.jpg";
 4             Date expiredTime = DateUtils.getNextMinute(new Date(), 60);
x 7             String authoriationStr = cosSigner.buildAuthorizationStr(HttpMethodName.PUT, "/"+key, new HashMap<>(), new HashMap<>(), cred, expiredTime, false);
 8             SimpleCosAuthorizationDTO authorization = new SimpleCosAuthorizationDTO();
 9             authorization.setAuthorization(authoriationStr);
10             authorization.setCosKey(key);
11             authorization.setHost("xxxxxxx.cos.ap-shanghai.myqcloud.com");
12             authorization.setSecurityToken(cosTempCredential.getSessionToken());
腾讯云API
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.191</version>
</dependency>

 

3. js上传

 1 function uploadFile(file, callback) {
 2     let load = layer.load(0, {shade: 0.3});
 3     $.ajax({
 4         url: contextPath + "cos/getTempCredential",
 5         type: "POST",
 6         data: {fileName: file.name.replace(/\+/g, "+")},
 7         dataType: "JSON",
 8         success: function (resp) {
 9             if (resp.code === SUCCESS_CODE) {
10                 let data = resp.data;
11                 if (data !== null && data !== undefined) {
12                     let url = 'https://' + data.host + '/' + data.cosKey;
14                     let xhr = new XMLHttpRequest();
15                     xhr.onload = function () {
16                         layer.close(load);
18                         callback(url);
19                     };
20                     xhr.onerror = function () {
21                         layer.close(load);
22                     };
23 
24                     xhr.open('PUT', url, false);
25                     xhr.setRequestHeader("Authorization", data.authorization);
26                     xhr.setRequestHeader("x-cos-security-token", data.securityToken);
28                     xhr.send(file);
29                 } else {
30                     layer.close(load);
31                     layer.alert("上传失败: 文件中心接口异常!", {icon: 5});
32                 }
33             } else {
34                 layer.close(load);
35             }
36         },
37         error: function() {
38             layer.close(load);
39             layer.alert("上传失败: 文件中心接口异常!", {icon: 5});
40         }
41     });
42 }

 

posted @ 2025-08-15 18:51  hyiam  阅读(15)  评论(0)    收藏  举报