帮你快速理解、总结文档立即下载

快速入门

最近更新时间:2025-03-14 19:27:02
我的收藏

下载与安装

相关资源

对象存储 COS 的 XML 小程序 SDK 源码下载地址:XML 小程序 SDK。
SDK 快速下载地址:XML 小程序 SDK。
演示示例 Demo 下载地址:XML 小程序 SDK Demo。
SDK 文档中的所有示例代码请参见 SDK 代码示例。
SDK 更新日志请参见 ChangeLog。
SDK 常见问题请参见:小程序 SDK 常见问题。
说明:
如果您在使用 SDK 时遇到函数或方法不存在等错误,请先将 SDK 升级到最新版再重试。

环境依赖

该 SDK 只适用于微信小程序环境。
登录 对象存储控制台 创建存储桶后,获取存储桶名称和 地域信息。
登录 访问管理控制台 获取您的项目 SecretId 和 SecretKey。
说明:
关于本文中出现的 SecretId、SecretKey、Bucket 等名称的含义和获取方式请参见 COS 术语信息。
关于跨端框架(例如 uni-app)的使用说明,使用小程序 SDK 开发后无法打包成正常使用的移动应用,例如 Android App、iOS App,需要使用对应的 Android SDK、iOS SDK。
XCosSecurityToken 字段说明:v1.2.0之前版本的 SDK 只支持 XCosSecurityToken,v1.2.0及之后的版本请使用 SecurityToken 代替。

安装 SDK

安装小程序 SDK 有两种方式:手动安装和 npm 安装,具体安装方法如下。

手动安装

复制源码文件中的 cos-wx-sdk-v5.js 到自己小程序代码根目录下任意路径,并用相对路径引用:
var COS = require('./lib/cos-wx-sdk-v5.js')

npm 安装

如果小程序代码使用了 webpack 打包,则通过 npm 安装依赖即可:
npm install cos-wx-sdk-v5
其中,程序代码使用 var COS = require('cos-wx-sdk-v5'); 进行引用。更多详情请参见 npm 支持。

开始使用

小程序域名白名单配置

小程序里请求 COS 需要登录到 微信公众平台,选择开发 > 开发设置 > 服务器域名,配置域名白名单。SDK 使用到了两个接口:
cos.postObject 使用 wx.uploadFile 方法。
其他方法使用 wx.request 方法。
需要在对应白名单里,配置 COS 域名,白名单域名格式有两种:
如果是标准请求,可以配置存储桶域名作为白名单域名,例如:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com。
如果小程序使用的存储桶多,可以选择后缀式请求 COS,只需要在 SDK 实例化时传入 ForcePathStyle: true,这种方式需要配置地域域名作为白名单,例如:cos.ap-guangzhou.myqcloud.com。

初始化

注意:
建议用户 使用临时密钥 调用 SDK,通过临时授权的方式进一步提高 SDK 使用的安全性。申请临时密钥时,请遵循 最小权限指引原则,防止泄露目标存储桶或对象之外的资源。
如果您一定要使用永久密钥,建议遵循 最小权限指引原则 对永久密钥的权限范围进行限制。
var COS = require('./lib/cos-wx-sdk-v5.js')
var cos = new COS({
// ForcePathStyle: true, // 如果使用了很多存储桶,可以通过打开后缀式,减少配置白名单域名数量,请求时会用地域域名
SimpleUploadMethod: 'putObject', // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用 putObject,sdk 版本至少需要v1.3.0
getAuthorization: function (options, callback) {
// 初始化时不会调用,只有调用 cos 方法(例如 cos.putObject)时才会进入
// 异步获取临时密钥
wx.request({
url: 'https://example.com/server/sts.php',
data: {
bucket: options.Bucket,
region: options.Region,
},
dataType: 'json',
success: function (result) {
var data = result.data;
var credentials = data && data.credentials;
if (!data || !credentials) return console.error('credentials invalid');
callback({
TmpSecretId: credentials.tmpSecretId,
TmpSecretKey: credentials.tmpSecretKey,
// v1.2.0之前版本的 SDK 使用 XCosSecurityToken 而不是 SecurityToken
SecurityToken: credentials.sessionToken,
// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
});
}
});
}
});

// 接下来可以通过 cos 实例调用 COS 请求。
// TODO

配置项

使用示例

创建一个 COS SDK 实例,COS SDK 支持以下几种格式创建:
格式一(推荐):后端通过获取临时密钥给到前端,前端计算签名。
var cos = new COS({
SimpleUploadMethod: 'putObject', // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用 putObject,SDK 版本至少需要v1.3.0
// 必选参数
getAuthorization: function (options, callback) {
// 服务端 JS 和 PHP 示例:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/
// 服务端其他语言参考 COS STS SDK :https://github.com/tencentyun/qcloud-cos-sts-sdk
// STS 详细文档指引看:https://cloud.tencent.com/document/product/436/14048
wx.request({
url: 'https://example.com/server/sts.php',
data: {
// 可从 options 取需要的参数
},
success: function (result) {
var data = result.data;
var credentials = data && data.credentials;
if (!data || !credentials) return console.error('credentials invalid');
callback({
TmpSecretId: credentials.tmpSecretId,
TmpSecretKey: credentials.tmpSecretKey,
// v1.2.0之前版本的 SDK 使用 XCosSecurityToken 而不是 SecurityToken
SecurityToken: credentials.sessionToken,
// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
});
}
});
}
});
说明:
临时密钥生成和使用可参见 临时密钥生成及使用指引。
格式二(推荐):细粒度控制权限,后端通过获取临时密钥给到前端,前端只有相同请求才重复使用临时密钥,后端可以通过 Scope 细粒度控制权限。
var cos = new COS({
SimpleUploadMethod: 'putObject', // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用 putObject,SDK 版本至少需要v1.3.0
// 必选参数
getAuthorization: function (options, callback) {
// 服务端示例:https://github.com/tencentyun/qcloud-cos-sts-sdk/edit/master/scope.md
wx.request({
url: 'https://example.com/server/sts-scope.php',
data: JSON.stringify(options.Scope),
success: function (result) {
var data = result.data;
var credentials = data && data.credentials;
if (!data || !credentials) return console.error('credentials invalid');
callback({
TmpSecretId: credentials.tmpSecretId,
TmpSecretKey: credentials.tmpSecretKey,
// v1.2.0之前版本的 SDK 使用 XCosSecurityToken 而不是 SecurityToken
SecurityToken: credentials.sessionToken,
// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
ScopeLimit: true, // 细粒度控制权限需要设为 true,会限制密钥只在相同请求时重复使用
});
}
});
}
});
说明:
临时密钥生成和使用可参见 临时密钥生成及使用指引。
格式三(不推荐):前端每次请求前都需要通过 getAuthorization 获取签名,后端使用固定密钥或临时密钥计算签名返回给前端。该格式分块上传权限不易控制,不推荐您使用此格式。
var cos = new COS({
SimpleUploadMethod: 'putObject', // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用 putObject,SDK 版本至少需要v1.3.0
// 必选参数
getAuthorization: function (options, callback) {
// 服务端获取签名,请参考对应语言的 COS SDK:https://cloud.tencent.com/document/product/436/6474
// 注意:这种有安全风险,后端需要通过 method、pathname 严格控制好权限,例如不允许 put / 等
wx.request({
url: 'https://example.com/server/auth.php',
data: JSON.stringify(options.Scope),
success: function (result) {
var data = result.data;
if (!data || !data.authorization) return console.error('authorization invalid');
callback({
Authorization: data.authorization,
// v1.2.0之前版本的 SDK 使用 XCosSecurityToken 而不是 SecurityToken
// SecurityToken: data.sessionToken, // 如果使用临时密钥,需要把 sessionToken 传给 SecurityToken
});
}
});
},
});
格式四(不推荐):前端使用固定密钥计算签名,该格式适用于前端调试,若使用此格式,请避免泄露密钥。
// SECRETID 和 SECRETKEY 请登录 https://console.cloud.tencent.com/cam/capi 进行查看和管理
var cos = new COS({
SecretId: 'SECRETID',
SecretKey: 'SECRETKEY',
SimpleUploadMethod: 'putObject', // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用putObject,sdk版本至少需要v1.3.0
});

构造函数参数说明

参数名
参数描述
类型
是否必填
SecretId
用户的 SecretId
String
否
SecretKey
用户的 SecretKey,建议只在前端调试时使用,避免暴露密钥
String
否
FileParallelLimit
同一个实例下上传的文件并发数,默认值3
Number
否
ChunkParallelLimit
同一个上传文件的分块并发数,默认值3
Number
否
ChunkRetryTimes
分块上传及分块复制时,出错重试次数,默认值2(加第一次,请求共3次)
Number
否
ChunkSize
分块上传时,每块的字节数大小,默认值1048576(1MB)
Number
否
SliceSize
使用 uploadFiles 批量上传时,文件大小大于该数值就使用分块上传 sliceUploadFile,否则使用简单上传 putObject,默认值1048576(1MB)
Number
否
CopyChunkParallelLimit
进行分块复制操作中复制分块上传的并发数,默认值20
Number
否
CopyChunkSize
使用 sliceCopyFile 分块复制文件时,每块的大小字节数,默认值10485760(10MB)
Number
否
CopySliceSize
使用 sliceCopyFile 分块复制文件时,文件大小大于该数值就会使用分块复制 sliceCopyFile ,否则使用简单复制 putObjectCopy,默认值10485760(10MB)
Number
否
ProgressInterval
上传进度的回调方法 onProgress 的回调频率,单位ms ,默认值1000
Number
否
Protocol
发请求时用的协议,可选项 https:、http:,默认判断当前页面是 http: 时使用 http:,否则使用 https:
String
否
ServiceDomain
调用 getService 方法时,请求的域名,例如service.cos.myqcloud.com
String
否
Domain
调用操作存储桶和对象的 API 时自定义请求域名。可以使用模板,例如 "{Bucket}.cos.{Region}.myqcloud.com" ,即在调用 API 时会使用参数中传入的 Bucket 和 Region 进行替换
String
否
UploadQueueSize
上传队列最长大小,超出的任务如果状态不是 waiting、checking、uploading 会被清理,默认10000
Number
否
ForcePathStyle
强制使用后缀式模式发请求,后缀式模式中 Bucket 会放在域名后的 pathname 里,并且 Bucket 会加入签名 pathname 计算,默认为 false
Boolean
否
UploadCheckContentMd5
强制上传文件校验 Content-MD5,会对文件请求 Body 计算 md5放在 header 的 Content-MD5字段里,默认为 false
Boolean
否
getAuthorization
获取签名的回调方法,如果没有 SecretId、SecretKey 时,这个参数必选
注意: 该回调方法在初始化实例时传入,在使用实例调用接口时才会执行并获取签名
Function
否
UseAccelerate
是否启用全球加速域名,默认为 false。若改为 true,需要存储桶开启全球加速功能,详情请参见 开启全球加速
Boolean
否
SimpleUploadMethod
高级上传、批量上传内部对小文件做简单上传的方法名,可选'postObject'或'putObject',默认为'postObject'(该参数 v1.3.0版本开始支持)
String
否

getAuthorization 回调函数说明(使用格式一)

getAuthorization: function(options, callback) { ... }
getAuthorization 的回调参数说明:
参数名
参数描述
类型
options
获取临时密钥需要的参数对象
Object
- Bucket
存储桶的名称,命名规则为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String
- Region
存储桶所在地域,枚举值请参见 地域和访问域名
String
callback
临时密钥获取完成后的回传方法
Function
获取完临时密钥后,callback 回传一个对象,回传对象的属性列表如下:
属性名
参数描述
类型
是否必填
TmpSecretId
获取回来的临时密钥的 tmpSecretId
String
是
TmpSecretKey
获取回来的临时密钥的 tmpSecretKey
String
是
SecurityToken
获取回来的临时密钥的 sessionToken,对应 header 的 x-cos-security-token 字段。v1.2.0之前版本的 SDK 使用 XCosSecurityToken 而不是 SecurityToken
String
是
StartTime
密钥获取的开始时间,即获取时刻的时间戳,单位秒,startTime,如:1580000000,用于签名开始时间,传入该参数可避免前端时间偏差签名过期问题
String
否
ExpiredTime
获取回来的临时密钥的 expiredTime,超时时刻的时间戳,单位秒,如:1580000900
String
是

getAuthorization 回调函数说明(使用格式二)

getAuthorization: function(options, callback) { ... }
getAuthorization 的函数说明回调参数说明:
参数名
参数描述
类型
options
获取签名需要的参数对象
Object
- Method
当前请求的 Method
Object
- Pathname
请求路径,用于签名计算
String
- Key
对象键(Object 的名称),对象在存储桶中的唯一标识,了解更多可参见 对象概述
注意:当使用实例请求的接口不是对象操作相关接口时,该参数为空。
String
- Query
当前请求的 query 参数对象,{key: 'val'} 的格式
Object
- Headers
当前请求的 header 参数对象,{key: 'val'} 的格式
Object
callback
临时密钥获取完成后的回调
Function
getAuthorization 计算完成后,callback 回传参数支持两种格式:
格式一:回传鉴权凭证字符串 Authorization。
格式二:回传一个对象,对象属性列表如下。
属性名
参数描述
类型
是否必填
Authorization
计算得到的签名字符串
String
是
SecurityToken
获取回来的临时密钥的 sessionToken,对应 header 的 x-cos-security-token 字段。v1.2.0之前版本的 SDK 使用 XCosSecurityToken 而不是 SecurityToken
String
否

获取鉴权凭证

实例本身鉴权凭证可以通过实例化时传入的参数控制如何获取,有三种获取方式:
1. 实例化时,传入 SecretId、SecretKey,每次需要签名都由实例内部计算。
2. 实例化时,传入 getAuthorization 回调,每次需要签名通过这个回调计算完返回签名给实例。
3. 实例化时,传入 getSTS 回调,每次需要临时密钥通过这个回调回去完返回给实例,在每次请求时实例内部使用临时密钥计算得到签名。

开启 beacon 上报

为了持续跟踪和优化 SDK 的质量,给您带来更好的使用体验,我们在 SDK 中引入了 腾讯灯塔 SDK。
说明:
腾讯灯塔只对 COS 侧的请求性能进行监控,不会上报业务侧数据。
若是想开启该功能,请先确保 SDK 版本升级到1.4.0及以上,然后在初始化中指定 EnableTracker 为 true。 并在小程序域名白名单中 request 合法域名里添加:https://h.trace.qq.com;https://oth.str.beacon.qq.com;https://otheve.beacon.qq.com;。
new COS({
EnableTracker: true,
})

使用方式

回调方式

文档里默认使用回调方式,使用代码如下:
// 这里省略初始化过程和上传参数
var cos = new COS({ ... });
cos.uploadFile({ ... }, function(err, data) {
if (err) {
console.log('上传出错', err);
} else {
console.log('上传成功', data);
}
});

Promise

sdk 同样支持 Promise 方式调用,例如上述回调方式的代码等同于以下代码:
// 这里省略初始化过程和上传参数
var cos = new COS({ ... });
cos.uploadFile({ ... }).then(data => {
console.log('上传成功', data);
}).catch(err => {
console.log('上传出错', err);
});

同步方式

同步方式基于 JavaScript 的 async 和 await,上述回调方式的代码等同于以下代码:
async function upload() {
// 这里省略初始化过程和上传参数
var cos = new COS({ ... });
try {
var data = await cos.uploadFile({ ... });
return { err: null, data: data }
} catch (err) {
return { err: err, data: null };
}
}
// 可以同步拿到请求的返回值,这里举例说明,实际返回的数据格式可以自定义
var uploadResult = await upload();
if (uploadResult.err) {
console.log('上传出错', uploadResult.err);
} else {
console.log('上传成功', uploadResult.data);
}
注意:
cos.getObjectUrl 目前只支持回调方式。

使用技巧

通常情况下我们只需要创建一个 COS SDK 实例,然后在需要调用SDK方法的地方直接使用这个实例即可,示例代码如下:
var cos = new COS({
....
});

/* 自己封装的上传方法 */
function myUpload() {
// 不需要在每个方法里创建一个 COS SDK 实例
// var cos = new COS({
// ...
// });
cos.putObject({
....
});
}

/* 自己封装的删除方法 */
function myDelete() {
// 不需要在每个方法里创建一个 COS SDK 实例
// var cos = new COS({
// ...
// });
cos.deleteObject({
....
});
}
以下是部分常用接口示例,更详细的初始化方法请参见 demo 示例。

创建存储桶

cos.putBucket({
Bucket: 'examplebucket-1250000000',
Region: 'ap-beijing',
}, function (err, data) {
console.log(err || data);
});
注意:
如果需要在小程序创建存储桶,但存储桶名称未知时,无法将存储桶名称配置为域名白名单,可以使用后缀式调用,相关处理措施请参见 常见问题。

查询存储桶列表

cos.getService(function (err, data) {
console.log(data && data.Buckets);
});

上传对象

强烈推荐使用高级上传接口 uploadFile,自动针对小文件使用简单上传,大文件使用分块上传,性能更好。详情请参见 高级上传 文档。
若使用临时密钥方式,需同时授权简单上传对象和分块上传的权限。请参见 授权指引。
常见上传错误排查,请参见 常见问题。
/* 初始化 cos */
var cos = new COS({
// getAuthorization: funciton() {}, // 参考上方初始化
SimpleUploadMethod: 'putObject', // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用 putObject
});

function handleFileInUploading(fileName, filePath) {
cos.uploadFile({
Bucket: 'examplebucket-1250000000', /* 填写自己的 bucket,必须字段 */
Region: 'COS_REGION', /* 存储桶所在地域,必须字段 */
Key: fileName, /* 存储在桶里的对象键(例如:1.jpg,a/b/test.txt,图片.jpg)支持中文,必须字段 */
FilePath: filePath, /* 上传文件路径,必须字段 */
SliceSize: 1024 * 1024 * 5, /* 触发分块上传的阈值,超过5MB使用分块上传,小于5MB使用简单上传。可自行设置,非必须 */
onProgress: function(progressData) {
console.log(JSON.stringify(progressData));
}
}, function(err, data) {
if (err) {
console.log('上传失败', err);
} else {
console.log('上传成功');
}
});
}

/* 选择文件,得到临时路径(以选择图片为例,选择其他文件请参考小程序官方 api) */
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original'], // 可以指定是原图还是压缩图,默认用原图
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
var filePath = res.tempFiles[0].path;
var fileName = filePath.substr(filePath.lastIndexOf('/') + 1);
handleFileInUploading(fileName, filePath);
}
});

查询对象列表

cos.getBucket({
Bucket: 'examplebucket-1250000000',
Region: 'ap-beijing',
Prefix: 'exampledir/', // 这里传入列出的文件前缀
}, function (err, data) {
console.log(err || data.Contents);
});

下载对象

注意:
该接口用于读取对象内容,如果需要发起浏览器下载文件,可以通过 cos.getObjectUrl 获取 url 再触发浏览器下载,具体参见 预签名 URL 文档。
cos.getObject({
Bucket: 'examplebucket-1250000000',
Region: 'ap-beijing',
Key: 'exampleobject.txt',
}, function (err, data) {
console.log(err || data.Body);
});

删除对象

cos.deleteObject({
Bucket: 'examplebucket-1250000000',
Region: 'ap-beijing',
Key: 'picture.jpg',
}, function (err, data) {
console.log(err || data);
});