一、准备工作
·你需要一个鸿蒙 NEXT 应用,这个应用可以是现有的工程,也可以是新建的一个空的工程,详情请参见 鸿蒙 NEXT 应用开发指引。
·请确保你的鸿蒙 NEXT 应用目标为 API 级别12或更高版本。
二、步骤1:集成 SDK
1. 运行此命令进行 SDK 依赖安装:
"dependencies": { … "@tencentcloud/smh_sdk":"1.0.5" }
2. SDK 需要网络权限,用于与 COS 服务器进行通信,请在应用模块下的 module.json5 中添加如下权限声明:
…"requestPermissions":[ { "name" : "ohos.permission.INTERNET", … }]…
三、步骤2:初始化
注意:在 控制台 创建媒体库后,控制台会展示为你生成的专属域名,强烈建议你将 SMHServiceConfig.sharedConfig().host 设置为你的专属域名。
注意:
// 配置控制台创建媒体库后显示的“访问域名”SMHServiceConfig.sharedConfig().host = "<libraryId>.api.tencentsmh.cn";// 配置 accesstoken 刷新回调SMHAccessTokenProvider.singleProvider().accessRefreshCallBack = <T>(request: SMHAPIRequest<T>) => {return new Promise(async (resolve, reject) => { try { let accessToken = new SMHAccessToken(); // 设置媒体库 ID accessToken.libraryId = "libraryId"; // 设置空间 ID accessToken.spaceId = "spaceId"; // 设置 accessToken accessToken.accessToken = "accessToken"; // 设置起始时间,Date 类型,此处通过毫秒时间戳构造 Date // 建议返回服务器时间作为签名的开始时间,避免由于用户手机本地时间偏差过大导致请求过期 accessToken.beginDate = new Date(); // 设置访问令牌的有效时长,单位为秒 accessToken.expiresIn = 1800; resolve(accessToken); } catch (err) { }});}
四、1. 上传文件
try { let filePath = "本地文件路径"; // 调用 SMHFileApis 的 uploadObject 方法进行文件上传 let task = SMHFileApis.uploadObject({ spaceId: "spaceId", libraryId: "libraryId", body: filePath, // 本地路径 uploadPath: `smh/test.jpg` // 目标路径 }); task.onStateChange = (state: SMHTransferState) => { // 任务状态回调 } task.confirmKeyInitCallback = (confimKey: string) => { // 上传返回 confirmKey 回调。用于断点续传 } task.onProgress = (progress) => { // 进度回调 } task.onFinish = (result?: object, error?: SMHError) => { // 完成回调 } // 启动任务 task.start(); //其他方法 //task.pause() 暂停任务 //task.cancel() 取消任务 //task.resume() 重新启动任务,与 pause 配合使用}catch (e) { // 异常处理}
断点续传
try { let filePath = "本地文件路径"; // 调用 SMHFileApis 的 uploadObject 方法进行文件上传 let task = SMHFileApis.uploadObject({ spaceId: "spaceId", libraryId: "libraryId", body: filePath, // 本地路径 uploadPath: `smh/test.jpg`, // 目标路径 confirmKey:"confirmKey"// confirmKeyInitCallback 回调返回的 confirmKey。 }); task.onStateChange = (state: SMHTransferState) => { // 任务状态回调 } task.confirmKeyInitCallback = (confimKey: string) => { // 上传返回 confirmKey 回调。用于断点续传 } task.onProgress = (progress) => { // 进度回调 } task.onFinish = (result?: object, error?: SMHError) => { // 完成回调 } // 启动任务 task.start(); //其他方法 //task.pause() 暂停任务 //task.cancel() 取消任务 //task.resume() 重新启动任务,与 pause 配合使用}catch (e) { // 异常处理}
五、2. 下载文件
注意:说明:
注意:下载接口默认支持断点续传,确保写入本地路径不变即可。
try { // 调用 SMHFileApis 的 downloadObject 方法进行文件下载 let task = SMHFileApis.downloadObject({ spaceId: "spaceId", libraryId: "libraryId", filePath: `smh/test.jpg`,// 远端路径 savePath: "本地路径" // 本地路径 }) task.onStateChange = (state: SMHTransferState) => { // 任务状态回调 } task.onProgress = (progress: HttpProgress) => { // 进度回调 } task.onFinish = (result?: object, error?: SMHError) => { // 完成回调 } // 启动任务 task.start(); //其他方法 //task.pause() 暂停任务 //task.cancel() 取消任务 //task.resume() 重新启动任务,与 pause 配合使用} catch (e) { // 异常处理}
六、3. 其他请求
// 列出文件夹所有文件try { let result = await SMHDirectoryApis.listDirectory({ libraryId:"libraryId", spaceId:"spaceId", dirPath:'', limit:'10', orderBy:SMHFileListOrderBy.name, orderByType:SMHOrderByType.asc, withFavoriteStatus:true, withInode:true });}catch (e) { // 异常处理}// 创建文件夹try { let result = await SMHDirectoryApis.createDirectory({ libraryId:"libraryId", spaceId:"spaceId", dirPath:'path', withInode:true });}catch (e) { // 异常处理}// 删除文件夹try { let result = await SMHDirectoryApis.deleteDirectory({ libraryId:"libraryId", spaceId:"spaceId", dirPath:'path'});}catch (e) { // 异常处理}
七、重试策略配置
// 设置重试间隔时间,默认:1sSMHServiceConfig.sharedConfig().retrySleep = 1 * 1000;// 设置重试次数,默认:3次SMHServiceConfig.sharedConfig().maxRetryCount = 3;
八、超时时间配置
// 读取超时时间。单位为毫秒(ms),默认为 30 * 1000ms。SMHServiceConfig.sharedConfig().readTimeout = 30 * 1000;// 连接超时时间。单位为毫秒(ms),默认为 15 * 1000ms。SMHServiceConfig.sharedConfig().connectTimeout = 15 * 1000;
九、并发策略配置
// 设置上传最大并发数。默认:4SMHServiceConfig.sharedConfig().setUploadMaxConcurrentCount(4);// 设置下载最大并发数。默认:4SMHServiceConfig.sharedConfig().setDownloadMaxConcurrentCount(4);
十、日志配置
// 自定义日志输出回调,用于业务层收集日志QCloudLogger.logOutputCallback = (log: string) => { console.log(log);}// 是否关闭日志:true:关闭, false:打开QCloudLogger.setClose(true);