相关资源
SDK 源码下载。
示例 Demo。
SDK 更新日志。
准备工作
您需要一个鸿蒙 NEXT 应用,这个应用可以是现有的工程,也可以是新建的一个空的工程,详情请参见 鸿蒙 NEXT 应用开发指引。
请确保您的鸿蒙 NEXT 应用目标为 API 级别12或更高版本。
步骤1:集成 SDK
1. 运行此命令进行 SDK 依赖安装:
ohpm install @tencentcloud/cos
这将向您工程的 oh-package.json5添加如下依赖代码:
"dependencies": {..."@tencentcloud/cos":"1.1.8"}
2. SDK 需要网络权限,用于与 COS 服务器进行通信,请在应用模块下的 module.json5中添加如下权限声明:
..."requestPermissions":[ { "name" : "ohos.permission.INTERNET",... } ]...
步骤2:开始使用
初始化密钥
将单个密钥设置给具体的 CosXmlRequest(例如上传的 PutObjectRequest 等),该密钥仅用于本次 COS 操作(例如上传等)。
import { QCloudCredential } from '@tencentcloud/cos';// 获取临时密钥(业务层控制获取的方式)let credential : QCloudCredential= new QCloudCredential();credential.secretID = "secretID";credential.secretKey = "secretKey";credential.token = "token";// startDate 和 expirationDate 均为 Date 类型,此处通过毫秒时间戳构造 Datecredential.startDate = new Date();credential.expirationDate = new Date();
采用回调的方式给 COS SDK 提供获取临时密钥的方法,SDK 会在首次和缓存的临时密钥快过期时使用该回调重新获取临时密钥。
import { CredentialCallBack, QCloudCredential } from '@tencentcloud/cos';export class Credential {/*** 获取 STS 临时密钥*/public static sessionCredential: CredentialCallBack = (request)=>{return new Promise((resolve, reject) => {// 首先从您的临时密钥服务器获取包含了密钥信息的响应let httpRequest = http.createHttp();httpRequest.request(// 请替换为具体的 sts 临时密钥获取服务 url"http://127.0.0.1/sts",{ method: http.RequestMethod.GET },(err: BusinessError, data: http.HttpResponse) => {if (!err) {const stsSessionQCloudCredentials: StsSessionQCloudCredentials = JSON.parse(data.result.toString());let credential : QCloudCredential= new QCloudCredential();credential.secretID = stsSessionQCloudCredentials.credentials.tmpSecretId;credential.secretKey = stsSessionQCloudCredentials.credentials.tmpSecretKey;credential.token = stsSessionQCloudCredentials.credentials.sessionToken;// 建议返回服务器时间作为签名的开始时间,避免由于用户手机本地时间偏差过大导致请求过期// startDate 和 expirationDate 均为 Date 类型,此处通过毫秒时间戳构造 Date,// sts 响应的时间戳一般单位为秒,因此需要乘以1000,如果您的临时密钥服务响应的时间单位为毫秒,则无需乘以1000credential.startDate = new Date(stsSessionQCloudCredentials.startTime * 1000);credential.expirationDate = new Date(stsSessionQCloudCredentials.expiredTime * 1000);httpRequest.destroy();// 最后返回临时密钥信息对象resolve(credential);} else {httpRequest.destroy();reject(err);}});})}}/*** 临时密钥实体定义*/export class StsSessionQCloudCredentials{credentials: StsCredentials;startTime: number;expiredTime: number;constructor(credentials: StsCredentials, startTime: number, expiredTime: number) {this.credentials = credentials;this.startTime = startTime;this.expiredTime = expiredTime;}}export class StsCredentials{tmpSecretId: string;tmpSecretKey: string;sessionToken: string;constructor(tmpSecretId: string, tmpSecretKey: string, sessionToken: string) {this.tmpSecretId = tmpSecretId;this.tmpSecretKey = tmpSecretKey;this.sessionToken = sessionToken;}}
采用回调的方式给 COS SDK 提供获取签名的方法,SDK 会在发起网络请求时调用该方法,该方法内可以做签名相关逻辑。
// 定义服务端签名回调let selfSignCallBack = async (request)=>{// 首先从您的服务器获取包含了签名信息的响应let httpRequest = http.createHttp();httpRequest.request(// 请替换为具体的签名获取服务 url"http://127.0.0.1/sign",{ method: http.RequestMethod.GET },(err: BusinessError, data: http.HttpResponse) => {if (!err) {// 拿到签名信息let signData: object = JSON.parse(data.result.toString());// 对 request 进行签名 header 的设置request.addHeader(HttpHeader.AUTHORIZATION, signData['authorization'])if(signData['securityToken']){request.addHeader("x-cos-security-token", signData['securityToken'])}httpRequest.destroy();} else {httpRequest.destroy();}});}
将单个请求签名设置给具体的 CosXmlRequest(例如上传的 PutObjectRequest 等),该签名仅用于本次 COS 操作(例如上传等)。
// 获取签名数据(业务层控制获取的方式) let authorization: string = "authorization"; let token: string = "token"; let tokenName: string = "x-cos-security-token";
您可以使用腾讯云的永久密钥来进行开发阶段的本地调试。由于该方式存在泄露密钥的风险,请务必在上线前替换为临时密钥的方式。
import { CredentialCallBack, QCloudCredential } from '@tencentcloud/cos';export class Credential { /** * 获取固定密钥 仅在测试时使用 */ public static constCredential: CredentialCallBack = (request)=>{ return new Promise((resolve, reject) => { let credential : QCloudCredential= new QCloudCredential();// 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140 credential.secretID = "SECRETID";// 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140 credential.secretKey = "SECRETKEY"; resolve(credential); }) } }
初始化 COS 服务
调用 CosXmlBaseService.initDefaultService 进行 COS 服务初始化之后就可以调用 CosXmlBaseService.default() 获取到默认的 COS 服务进行 COS 操作了。
COS 服务也支持自行实例化 CosXmlBaseService 进行 COS 操作(不建议每次 COS 操作都实例化一个 CosXmlBaseService)。
1. 初始化默认的 Service,可以不设置临时密钥回调。
import { CosXmlBaseService, CosXmlServiceConfig } from '@tencentcloud/cos';// 服务配置let cosXmlServiceConfig = new CosXmlServiceConfig("ap-guangzhou");// 初始化默认的 ServiceCosXmlBaseService.initDefaultService(this.context.getApplicationContext(),cosXmlServiceConfig// 可以不设置临时密钥回调)
2. 给 CosXmlRequest 设置 credential 并使用。
单次临时密钥的优先级高于 CosXmlBaseService 中初始化配置的临时密钥回调,因此 CosXmlBaseService 中配置的临时密钥回调不会影响单次临时密钥的设置,直接给 CosXmlRequest 设置 credential 即可。
import { CosXmlBaseService, PutObjectRequest, UploadTask } from '@tencentcloud/cos';// 任何 CosXmlRequest 都支持这种方式,例如上传 PutObjectRequest、下载 GetObjectRequest、删除 DeleteObjectRequest 等// 以下用上传进行示例let putRequest = new PutObjectRequest("examplebucket-1250000000", "exampleobject.txt", "本地文件路径");// credential 为第一步“初始化密钥”中获取到的单次临时密钥putRequest.credential = credential;let task: UploadTask = CosXmlBaseService.default().upload(putRequest);task.start();
初始化默认的 Service。
import { CosXmlBaseService, CosXmlServiceConfig } from '@tencentcloud/cos';// 服务配置let cosXmlServiceConfig = new CosXmlServiceConfig("ap-guangzhou");// 初始化默认的 ServiceCosXmlBaseService.initDefaultService(this.context.getApplicationContext(),cosXmlServiceConfig,// 第一步“初始化密钥”中获取到的临时密钥回调Credential.sessionCredential)
初始化默认的 Service。
import { CosXmlBaseService, CosXmlServiceConfig } from '@tencentcloud/cos';// 服务配置let cosXmlServiceConfig = new CosXmlServiceConfig("ap-guangzhou");// 初始化默认的 ServiceCosXmlBaseService.initDefaultService(this.context.getApplicationContext(),cosXmlServiceConfig)// 第一步“初始化密钥”中获取到的服务端签名回调CosXmlBaseService.default().setSelfSignCallBack(selfSignCallBack);
单次请求签名的优先级高于密钥进行的签名,因此设置的密钥不会影响单次请求签名的设置,直接给 cosXmlRequest 通过 setSign 设置签名即可。
import { CosXmlBaseService, PutObjectRequest, UploadTask } from '@tencentcloud/cos';// 任何 CosXmlRequest 都支持这种方式,例如上传 PutObjectRequest、下载 GetObjectRequest、删除 DeleteObjectRequest 等// 以下用上传进行示例let putRequest = new PutObjectRequest("examplebucket-1250000000", "exampleobject.txt", "本地文件路径");// authorization、token、tokenName 为第一步“初始化密钥”中获取到的单次签名信息putRequest.setSign(authorization, stoken, tokenName);let task: UploadTask = CosXmlBaseService.default().upload(putRequest);task.start();
初始化默认的 Service。由于该方式存在泄露密钥的风险,请务必在上线前替换为临时密钥的方式。
// 服务配置let cosXmlServiceConfig = new CosXmlServiceConfig("ap-guangzhou");// 初始化默认的 ServiceCosXmlBaseService.initDefaultService( this.context.getApplicationContext(), cosXmlServiceConfig,// 第一步“初始化密钥”中获取到的固定密钥回调 Credential.constCredential )
参数说明
CosXmlServiceConfig 用于配置 COS 服务,其主要成员说明如下:
参数名称 | 描述 | 类型 | 默认值 | 必选 |
region | string | 无 | 否(和 host 二选一) | |
protocol | 网络协议:https、http | string | https | 否 |
connectTimeout | 连接超时时间(单位是毫秒) | number | 15 * 1000 | 否 |
readTimeout | 读取超时时间(单位是毫秒) | number | 30 * 1000 | 否 |
host | 自定义域名,sdk 会将 ${bucket} 替换为真正的 bucket,${region} 替换为真正的 region 例如:将 host 设置为 ${bucket}.${region}.tencent.com,并且您的存储桶和地域分别为 bucket-1250000000和 ap-shanghai,那么最终的请求地址为 bucket-1250000000.ap-shanghai.tencent.com | string | ${bucket}.cos.${region}.myqcloud.com | 否(和 region 二选一) |
port | 设置请求的端口 | number | 无 | 否 |
headers | 设置公共 header | Map<string, string> | 无 | 否 |
noSignHeaderKeys | 设置不签名的 header | Set<string> | 无 | 否 |
uploadMaxConcurrentCount | 上传任务并发数 | number | 4 | 否 |
downloadMaxConcurrentCount | 下载任务并发数 | number | 4 | 否 |
maxRetryCount | 重试最大次数 | number | 3 | 否 |
retrySleep | 重试间隔时间,单位:毫秒 | number | 1000 | 否 |
dnsOverHttps | 设置使用 https 协议的服务器进行 DNS 解析 | string | 无 | 否 |
dnsServers | 设置指定的 DNS 服务器进行 DNS 解析,最多3个 | Array<string> | 无 | 否 |
步骤3:访问 COS 服务
上传对象
授权说明
{"version": "2.0","statement": [{"action": [//head 操作"name/cos:HeadObject",//简单上传操作"name/cos:PutObject",//分块上传:初始化分块操作"name/cos:InitiateMultipartUpload",//分块上传:List 已上传分块操作"name/cos:ListParts",//分块上传:上传分块操作"name/cos:UploadPart",//分块上传:完成所有分块上传操作"name/cos:CompleteMultipartUpload",//取消分块上传操作"name/cos:AbortMultipartUpload"],"effect": "allow","resource": ["qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"]}]}
上传示例
import { CosXmlBaseService, HttpProgress, PutObjectRequest, UploadTask, TransferConfig, CosError } from '@tencentcloud/cos';import { CosXmlUploadTaskResult } from '@tencentcloud/cos/src/main/ets/transfer/UploadTask'// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucketlet bucket = "examplebucket-1250000000";//对象在存储桶中的位置标识符,即称对象键let cosPath = "exampleobject.txt";//本地文件路径let srcPath = "本地文件路径";//若存在初始化分块上传的 UploadId,则赋值对应的 _uploadId 值用于续传;否则,赋值 undefinedlet _uploadId: string | undefined = undefined;// 上传配置let transferConfig = new TransferConfig();let putRequest = new PutObjectRequest(bucket, cosPath, srcPath); let task: UploadTask = CosXmlBaseService.default().upload(putRequest, _uploadId, transferConfig);// 上传进度回调 task.onProgress = (progress: HttpProgress) => {// progress.complete 为当前已上传大小// progress.target 为总大小};task.onResult = {// 上传成功回调onSuccess: (request, result: CosXmlUploadTaskResult) => {// todo 上传成功后的逻辑},//上传失败回调 onFail: (request, error: CosError) => { // todo 上传失败后的逻辑 } }//初始化完成回调task.initCallBack = (uploadId) =>{//用于下次续传上传的 uploadId _uploadId = uploadId; }//开始上传 task.start();//暂停任务// task.pause();//恢复任务// task.resume();//取消任务// task.cancel();
TransferConfig 用于配置 COS 上传服务,其主要参数说明如下:
参数名称 | 描述 | 类型 | 默认值 | 必选 |
simpleUploadLimit | 简单上传限制。文件大小小于该值,使用简单上传;大于等于则使用分块上传 | number | 1 * 1024 * 1024 | 否 |
sliceLength | 设置分块上传时每个分块的大小 | number | 1 * 1024 * 1024 | 否 |
下载对象
授权说明
{"version": "2.0","statement": [{"action": [//head操作"name/cos:HeadObject",//下载操作"name/cos:GetObject",],"effect": "allow","resource": ["qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"]}]}
下载示例
高级接口支持暂停、恢复以及取消下载请求,同时支持断点下载功能。
您只需要保证 bucket、cosPath、savePath 参数一致,SDK 便会从上次已经下载的位置继续下载。
import { CosXmlBaseService, HttpProgress, GetObjectRequest, DownloadTask, CosError } from '@tencentcloud/cos';import { CosXmlDownloadTaskResult } from '@tencentcloud/cos/src/main/ets/transfer/DownloadTask'// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucketlet bucket = "examplebucket-1250000000";//对象在存储桶中的位置标识符,即称对象键let cosPath = "exampleobject.txt";//本地文件下载路径,如果文件不存在 sdk 会自动创建let downliadPath = "本地文件路径";let getRequest = new GetObjectRequest(bucket, cosPath, downliadPath); let task: DownloadTask = CosXmlBaseService.default().download(getRequest);// 下载进度回调 task.onProgress = (progress: HttpProgress) => {// progress.complete 为当前已下载大小// progress.target 为总大小};task.onResult = {// 下载成功回调 onSuccess: (request, result: CosXmlDownloadTaskResult) => { // todo 下载成功后的逻辑 },//下载失败回调onFail: (request, error: CosError) => {// todo 下载失败后的逻辑}}//开始下载 task.start();//暂停任务// task.pause();//恢复任务// task.resume();//取消任务// task.cancel();
说明:
高级下载接口支持断点续传,所以会在下载前先发起 HEAD 请求获取文件信息。如果您使用的是临时密钥或者使用子账号访问,请确保权限列表中包含 HeadObject 的权限。