tencent cloud

文档反馈

快速入门

最后更新时间:2024-01-22 11:32:01

    下载与安装

    相关资源

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

    环境依赖

    1. 该 SDK 只适用于微信小程序环境。
    2. 登录 对象存储控制台 创建存储桶后,获取存储桶名称和 地域信息
    3. 登录 访问管理控制台 获取您的项目 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 使用到了两个接口:
    1. cos.postObject 使用 wx.uploadFile 方法。
    2. 其他方法使用 wx.request 方法。
    需要在对应白名单里,配置 COS 域名,白名单域名格式有两种:
    1. 如果是标准请求,可以配置存储桶域名作为白名单域名,例如: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com
    2. 如果小程序使用的存储桶多,可以选择后缀式请求 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://www.tencentcloud.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://www.tencentcloud.com/document/product/436/6474?from_cn_redirect=1
    // 注意:这种有安全风险,后端需要通过 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.tencentcloud.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);
    });
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持