腾讯云对象存储原生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 }

浙公网安备 33010602011771号