小程序端上传视频的 SDK。上传流程请参见 客户端上传指引。
·如果你需要 SDK 源码,可访问 SDK 源码。
·如果你需要 Demo 源码,可访问 Demo 源码。
一、上传视频步骤
1. 引入 SDK
·直接引入文件
const VodUploader = require('../../lib/vod-wx-sdk-v2.js');
·npm 安装
npm i vod-wx-sdk-v2import VodUploader from 'vod-wx-sdk-v2'
2. 定义获取上传签名的函数
getSignature: function(callback) { wx.request({ /** * 此处省略部分代码 */ url: url, success: function(res) { callback(signature) } });}
注意:说明:
3. 上传视频
上传视频是通过调用VodUploader.start来实现的,选择视频则通过微信小程序 API 中的wx.chooseVideo方法实现。示例如下:
const uploader = VodUploader.start({ // 必填,把 wx.chooseVideo 回调的参数(file)传进来 mediaFile: videoFile, // 必填,获取签名的函数 getSignature: getSignature, // 选填,视频名称,强烈推荐填写(如果不填,则默认为“来自小程序”) mediaName: fileName, // 选填,视频封面,把 wx.chooseImage 回调的参数(file)传进来 coverFile: coverFile, // 上传中回调,获取上传进度等信息 progress: function(result) { console.log('progress'); console.log(result); }, // 上传完成回调,获取上传后的视频 URL 等信息 finish: function(result) { console.log('finish'); console.log(result); wx.showModal({ title: '上传成功', content: 'fileId:' + result.fileId + '\\nvideoName:' + result.videoName, showCancel: false }); }, // 上传错误回调,处理异常 error: function(result) { console.log('error'); console.log(result); wx.showModal({ title: '上传失败', content: JSON.stringify(result), showCancel: false }); },});
注意:说明:
注意:如需上传至指定应用下,请参见 应用体系 – 客户端上传。
二、VodUploader.start
| 参数名称 | 必填 | 类型 | 参数描述 |
| getSignature | 是 | Function | 获取上传签名的函数。 |
| mediaFile | 是 | file | wx.chooseVideo 回调返回的文件对象。 |
| reportId | 否 | number | 填入后,会携带上报至点播后台。 |
| mediaName | 否 | string | 视频名称,推荐填写(如果不填,则默认为“来自小程序”)。 |
| coverFile | 否 | file | 视频封面,wx.chooseImage 回调返回的文件对象。 |
| fileParallelLimit | 否 | number | 同一个实例下上传的文件并发数,默认值3。 |
| chunkParallelLimit | 否 | number | 同一个上传文件的分块并发数,默认值6。 |
| chunkRetryTimes | 否 | number | 分块上传时,出错重试次数,默认值2(加第一次,请求共3次)。 |
| chunkSize | 否 | number | 分块上传时,每片的字节数大小,默认值8388608(8MB)。 |
| progressInterval | 否 | number | 上传进度的回调方法 onProgress 的回调频率,单位 ms ,默认值1000。 |
| progress | 是 | Function | 上传 progress 事件回调,返回上传进度等信息。 |
| finish | 是 | Function | 上传结束回调,返回 fileId 等信息。 |
| error | 是 | Function | 错误处理回调。 |
三、progress 回调
| 字段名 | 类型 | 字段描述 |
| loaded | number | 已上传大小。 |
| percent | number | 已上传大小百分比。 |
| speed | number | 上传速度。 |
| total | number | 总大小。 |
四、finish 回调
| 字段名 | 类型 | 字段描述 |
| coverUrl | string | 封面图 URL,如未上传封面则此处为 undefined。 |
| fileId | string | 视频 fileId。 |
| videoName | string | 视频名称。 |
| videoUrl | string | 视频链接。 |
五、error 回调
| 字段名 | 类型 | 字段描述 |
| code | number | 错误码。 |
| message | string | 错误信息。 |
六、其他说明
1. 由于小程序没有获取真实文件名的 API,所以需要在上传视频时指定视频名称。如不传入mediaName,SDK 会设置视频名称为“来自小程序”。
2. 默认支持断点续传和分片上传。
3. 小程序域名信息中,request和uploadFile为合法域名,只需加上vod2.qcloud.com即可。
4. 小程序端默认判断当前页面的域名是 http: 时,使用 http: 域名上传。若判断域名非 http: 时,则使用 https: 域名上传。
5. uni-app 集成小程序上传 SDK,因平台限制,仅在微信和 QQ 等部分小程序平台支持分片上传,Android 和 iOS 平台 App 建议集成原生上传 SDK,否则可能影响大文件的上传质量。
七、4XX 类型错误
| HTTP 状态码 | 错误码 | 描述 |
| 400 Bad Request | ActionAccelerateNotSupported | 加速域名不支持该操作 |
| 400 Bad Request | AttachmentFull | ACL 和 Policy 数量到达上限。详情请参见 规格与限制。 |
| 400 Bad Request | BadDigest | 提供的 Content-MD5 值与服务端收到的请求体的 MD5 哈希值不一致。 |
| 400 Bad Request | BadRequest | 参数错误 |
| 400 Bad Request | BucketAccelerateNotEnabled | 该存储桶未启用加速域名 |
| 400 Bad Request | BucketNameTooLong | 存储桶名称过长。详情请参见 存储桶命名规范。 |
| 400 Bad Request | BucketVersionNotOpen | 存储桶未启用版本控制。 |
| 400 Bad Request | DNSRecordVerifyFailed | DNS 记录验证失败,请添加 CNAME 或 TXT 记录。DNS 记录可能需要最多10分钟生效。 |
| 400 Bad Request | EntitySizeNotMatch | 请求体大小与 Content-Length 请求头不符 |
| 400 Bad Request | EntityTooLarge | 上传的对象大小超过规定的最大值。详情请参见 规格与限制。 |
| 400 Bad Request | EntityTooSmall | 上传的对象大小不足规定的最小值,常见于分块上传。详情请参见 规格与限制。 |
| 400 Bad Request | ExpiredToken | 临时密钥 Token 已过期 |
| 400 Bad Request | ImageResolutionExceed | 图片分辨率超出限制或动图帧数过多 |
| 400 Bad Request | ImageTooLarge | 图片超过限制大小 |
| 400 Bad Request | IncompleteBody | 请求体大小小于 Content-Length 请求头 |
| 400 Bad Request | IncorrectNumberOfFilesInPostRequest | POST Object 请求每次只允许上传一个对象 |
| 400 Bad Request | InvalidArgument | 请求参数不合法,请确认是否允许携带该请求参数。 |
| 400 Bad Request | InvalidBucketName | 存储桶名称不合法。详情请参见存储桶 命名规范。 |
| 400 Bad Request | InvalidCopySource | 复制对象源不合法 |
| 400 Bad Request | InvalidDelimiter | 分隔符(delimiter)参数不合法,分隔符只能为一个字符。 |
| 400 Bad Request | InvalidDigest | 给定的 Content-MD5 值不合法 |
| 400 Bad Request | InvalidImageFormat | 图片格式不合法 |
| 400 Bad Request | InvalidImageSource | 图片源不合法 |
| 400 Bad Request | InvalidLocationConstraint | 指定的 location 不合法 |
| 400 Bad Request | InvalidObjectName | 对象名称不合法。详情请参见 对象键。 |
| 400 Bad Request | InvalidPart | 分块缺失 |
| 400 Bad Request | InvalidPartOrder | 分块的编号不连续 |
| 400 Bad Request | InvalidPicOperations | Pic-Operations 请求头不合法 |
| 400 Bad Request | InvalidPolicyDocument | POST Object 请求中的策略(Policy)不合法 |
| 400 Bad Request | InvalidRegionName | 不合法的地域名。详情请参见 地域和访问域名。 |
| 400 Bad Request | InvalidRequest | 请求不合法 |
| 400 Bad Request | InvalidSHA1Digest | 请求内容 SHA1 校验不合法 |
| 400 Bad Request | InvalidTag | 存储桶标签不合法。详情请参见 存储桶标签概述。 |
| 400 Bad Request | InvalidTargetBucketForLogging | 用于存放日志的目标存储桶不合法,目标存储桶必须与当前存储桶在同一个地域。 |
| 400 Bad Request | InvalidUploadStatus | 当启用版本控制时不能使用 JSON API 上传对象,请使用 XML API。 |
| 400 Bad Request | InvalidURI | URI 不合法 |
| 400 Bad Request | InventoryFull | 清单任务数量已达到限制。清单任务上限1000条。 |
| 400 Bad Request | JsonAPINotSupportOnMAZBucket | JSON API 不支持操作多 AZ 存储桶,请使用 XML API。 |
| 400 Bad Request | KeyTooLong | 对象键过长。详情请参见 对象键。 |
| 400 Bad Request | KmsException | 密钥管理服务异常 |
| 400 Bad Request | KmsKeyDisabled | 提供的密钥已被禁用 |
| 400 Bad Request | KmsKeyNotExist | 提供的密钥不存在 |
| 400 Bad Request | ListPartUploadIdIsEmpty | UploadId 为空 |
| 400 Bad Request | LoggingConfExists | 日志配置已存在 |
| 400 Bad Request | LoggingPrefixInvalid | 日志前缀参数不合法 |
| 400 Bad Request | MalformedPolicy | 策略格式不合法 |
| 400 Bad Request | MalformedPOSTRequest | 该 POST 请求的请求体内容不合法 |
| 400 Bad Request | MalformedXML | 请求体的 XML 格式不符合 XML 语法 |
| 400 Bad Request | MAZOperationNotSupportOnOAZBucket | 单可用区(单 AZ)存储桶不支持多可用区(多 AZ)操作。关于多 AZ 特性及使用限制的说明请参见 多 AZ 特性概述。 |
| 400 Bad Request | MissingRequestBodyError | 请求体缺失 |
| 400 Bad Request | MultiAZFeatureNotSupport | 当前地域不支持多可用区 |
| 400 Bad Request | MultiBucketNotSupport | 跨地域复制只能设置一个目的存储桶 |
| 400 Bad Request | NotifyRuleEventConflict | 通知规则 Event 冲突 |
| 400 Bad Request | NotifyRulePrefixConflict | 通知规则 Prefix 冲突 |
| 400 Bad Request | NotifyRuleSuffixConflict | 通知规则 Suffix 冲突 |
| 400 Bad Request | NotSupportedStorageClass | 指定的 存储类型 不支持 |
| 400 Bad Request | OAZOperationNotSupportOnMAZBucket | 多可用区存储桶不支持单可用区操作。关于多 AZ 特性及使用限制的说明请参见 多 AZ 特性概述。 |
| 400 Bad Request | PolicyFull | ACL 和 Policy 数量到达上限。详情请参见 规格与限制。 |
| 400 Bad Request | PolicyVersionFull | Policy 版本数量到达上限 |
| 400 Bad Request | RequestTimeout | 请求超时 |
| 400 Bad Request | SsecDecryptHeaderInvalid | 源文件使用 SSE-C 加密,需要在请求头中提供相同的密钥。 |
| 400 Bad Request | SSEContentNotSupported | 加密方式不支持 |
| 400 Bad Request | SSEHeaderNotAllowed | 该操作不支持指定的服务端加密头部 |
| 400 Bad Request | TargetBucketNameInvalid | 目标存储桶名称不合法。详情请参见存储桶 命名规范。 |
| 400 Bad Request | TooManyBuckets | 存储桶数目达到上限200 |
| 400 Bad Request | UnexpectedContent | 请求不支持相关内容 |
| 400 Bad Request | UserCnameInvalid | 用户指定的 CNAME 不存在或不合法 |
| 400 Bad Request | UserNetworkTooSlow | 用户的网络速度过慢 |
| 400 Bad Request | VerifyAlgorithmNotSupported | 校验算法不支持 |
| 400 Bad Request | WebsiteURLInvalid | 自定义域名 URL 不合法 |
| 400 Bad Request | XMLSizeLimit | XML 长度超过限制 |
| 402 Payment Required | PaymentRequired | 超出费用配额限制 |
| 403 Forbidden | AccessDenied | 签名或者权限不正确,拒绝访问。请参考 请求签名 和 ACL 概述。 |
| 403 Forbidden | AccessForbidden | 跨域资源共享(CORS)请求被拒绝,请检查请求方法或请求头部中的 Origin、Access-Control-Request-Method、Access-Control-Request-Headers 是否在配置的 CORS 白名单中。 |
| 403 Forbidden | InvalidAccessKeyId | SecretID 不存在 |
| 403 Forbidden | InvalidObjectState | 对象存储类型与操作请求冲突 |
| 403 Forbidden | NoProcessAuthority | 没有处理图片的权限 |
| 403 Forbidden | RequestTimeTooSkewed | 本地时间与服务器时间相差过大,超过15分钟。 |
| 403 Forbidden | Request has expired | 发起请求的时间超过了签名的有效时间,或者本地系统时间和所在时区的时间不一致。详情请参见 常见问题。 |
| 403 Forbidden | SignatureDoesNotMatch | 客户端计算的签名与 COS 服务端计算的签名不一致。请参阅 请求签名 文档并借助 COS 请求签名工具 检查自行实现的签名过程。 |
| 403 Forbidden | UserNotSourceBucketOwner | 当前用户不是源存储桶的拥有者 |
| 403 Forbidden | UserNotTargetBucketOwner | 当前用户不是目标存储桶的拥有者 |
| 404 Not Found | InventoryConfigurationNotFoundError | 清单配置未找到 |
| 404 Not Found | NoBucketQuotaPolicy | 存储桶配额策略不存在 |
| 404 Not Found | NoSuchBucket | 指定的存储桶不存在 |
| 404 Not Found | NoSuchCopySource | 复制对象源不存在 |
| 404 Not Found | NoSuchCORSConfiguration | 指定的跨域资源共享配置不存在 |
| 404 Not Found | NoSuchEncryptionConfiguration | 指定的存储桶加密配置不存在 |
| 404 Not Found | NoSuchJob | 指定的批量处理任务不存在 |
| 404 Not Found | NoSuchKey | 指定的对象键不存在。检查对象是否存在请使用 HEAD Object 接口。 |
| 404 Not Found | NoSuchLifecycleConfiguration | 指定的生命周期配置不存在 |
| 404 Not Found | NoSuchObjectLockConfiguration | 指定的对象锁定配置不存在 |
| 404 Not Found | NoSuchPolicyVersion | 指定的策略版本不存在 |
| 404 Not Found | NoSuchTagSet | 指定的标签集合不存在 |
| 404 Not Found | NoSuchUpload | 分块上传时指定的 UploadId 不存在 |
| 404 Not Found | NoSuchVersion | 指定版本不存在 |
| 404 Not Found | NoSuchWebsiteConfiguration | 指定的静态网站配置不存在 |
| 404 Not Found | OriginConfigurationNotFoundError | 回源配置未找到 |
| 404 Not Found | ReplicationConfigurationNotFoundError | 跨地域复制配置未找到 |
| 405 Method Not Allowed | MethodNotAllowed | 此资源不支持该 HTTP 方法 |
| 405 Method Not Allowed | RestoreNonArchiveObject | 不允许对非归档对象进行回热(恢复) |
| 405 Method Not Allowed | UploadIdNotSupported | 指定的 UploadId 由 JSON API 生成,不能使用 XML API 操作。 |
| 409 Conflict | AppendPositionErr | Append 操作时,对象长度和 Position 不一致。 |
| 409 Conflict | BucketAlreadyExists | 指定的存储桶已存在 |
| 409 Conflict | BucketAlreadyOwnedByYou | 指定的存储桶已存在且由当前账户创建 |
| 409 Conflict | BucketLocked | 存储桶已锁定,不能操作跨地域复制或生命周期。 |
| 409 Conflict | BucketNotEmpty | 存储桶不为空 |
| 409 Conflict | DomainConfigConflict | 域名配置冲突,请删除冲突的记录。 |
| 409 Conflict | InvalidBucketState | 存储桶状态与操作请求冲突,例如版本控制管理与跨地域复制的冲突。 |
| 409 Conflict | InvalidLockedTime | 对象锁定时间无效 |
| 409 Conflict | ObjectLocked | 对象已锁定,不允许覆盖上传或删除该对象,也不允许通过复制修改该对象的元数据。 |
| 409 Conflict | InvalidObjectState | 对象状态与操作请求冲突 |
| 409 Conflict | PathConflict | 存在同名对象的毫秒级并发冲突 |
| 409 Conflict | QuotaConflict | 配额冲突 |
| 409 Conflict | QuotaOperationConflict | 该存储桶的状态不适用于该操作 |
| 409 Conflict | RecordAlreadyExist | DNS 记录冲突,请删除冲突的记录,或添加 CNAME/TXT 记录。 |
| 409 Conflict | RestoreAlreadyInProgress | 该对象正在回热(恢复)中 |
| 409 Conflict | UploadConflict | 同一个对象键频繁上传会导致冲突 |
| 409 ObjectNotAppendable | ObjectNotAppendable | 指定的对象不能追加 |
| 411 Length Required | MissingContentLength | Content-Length 请求头部缺失 |
| 412 Precondition Failed | PreconditionFailed | 前置条件不匹配 |
| 416 Requested Range Not Satisfiable | InvalidRange | 请求的对象范围不合法 |
| 424Failed Dependency | MirrorFailed | 镜像源站返回403 |
| 451 Unavailable For Legal Reasons | DomainAuditFailed | 域名未备案 |
| 451 Unavailable For Legal Reasons | UnavailableForLegalReasons | 当前服务不可用,请检查账号是否欠费,若无欠费可通过 内容合规 查看是否存在违规内容。 |
八、5XX 类型错误
| HTTP 状态码 | 错误码 | 描述 |
| 500 Internal Server Error | InternalError | 服务端内部错误 |
| 500 Internal Server Error | KmsInternalException | 查询密钥管理服务时发生服务端内部错误 |
| 501 Not Implemented | NotImplemented | 请求尚未实现 |
| 503 Service Unavailable | KmsFreqControl | 请降低使用密钥管理服务的请求的访问频率 |
| 503 Service Unavailable | ServiceUnavailable | 服务暂不可用,请重试。 |
| 503 Service Unavailable | SlowDown | 访问带宽超过阈值,触发流控。报错信息:Connection refused due to traffic overload.访问频率超过阈值,触发频控。报错信息:Message:Reduce your request rate. |
九、申请上传: ApplyUpload
| 错误码 | 描述 |
| FailedOperation | 操作失败。 |
| InternalError | 内部错误。 |
| InvalidParameter.ExpireTime | 参数值错误:过期时间。 |
| InvalidParameterValue.CoverType | 参数值错误:封面类型。 |
| InvalidParameterValue.ExpireTime | 参数值错误:ExpireTime 格式错误。 |
| InvalidParameterValue.MediaType | 参数值错误:媒体类型。 |
| InvalidParameterValue.SubAppId | 参数值错误:子应用 ID。 |
| UnauthorizedOperation | 未授权操作。 |
十、确认上传:CommitUpload
| 错误码 | 描述 |
| InternalError | 内部错误。 |
| InvalidParameterValue.SubAppId | 参数值错误:子应用 ID。 |
| InvalidParameterValue.VodSessionKey | 参数值错误:点播会话。 |
| ResourceNotFound | 资源不存在。 |
| UnauthorizedOperation | 未授权操作。 |