logo
0
0
WeChat Login

SMH Go SDK

腾讯云智能媒资托管(Smart Media Hosting)Go SDK

安装

go get cnb.cool/tencent/cloud/smh/smh-go-sdk

快速开始

初始化客户端

步骤 1:初始化 & 配置访问域名

⚠️ 重要说明

在使用 SDK 前,您需要先在 腾讯云智能媒资托管控制台 创建媒体库。创建完成后,控制台会展示为您生成的专属域名(如 smhxxx.api.tencentsmh.cn),如下图所示:

专属域名

请务必将 SDK 的服务器地址设置为您的专属域名。

package main import ( "context" client "cnb.cool/tencent/cloud/smh/smh-go-sdk" ) func main() { // 创建配置 cfg := client.NewConfiguration() // 设置专属域名(必须),请将 URL 替换为您在控制台获取的专属域名 cfg.Servers = client.ServerConfigurations{ { URL: "https://smhxxx.api.tencentsmh.cn", // 替换为您的专属域名 Description: "SMH API Server", }, } // 创建客户端 apiClient := client.NewAPIClient(cfg) }

步骤 2:获取访问令牌

// 获取访问令牌 ctx := context.Background() tokenResp, httpRes, err := apiClient.TokenAPI.CreateToken(ctx). LibraryId("your-library-id"). LibrarySecret("your-library-secret"). SpaceId("your-space-id"). UserId("user-id"). Execute() if err != nil { panic(err) }

步骤 3:Access Token 续期

Token 有效期(默认 2 小时),过期后需要重新获取。建议在业务代码中实现 Token 续期逻辑:

// Token 续期函数 func renewToken(ctx context.Context, apiClient *client.APIClient, libraryId string, accessToken string) (string, error) { resp, _, err := apiClient.TokenAPI.RenewToken(ctx, libraryId, accessToken).Execute() if err != nil { return "", err } if resp != nil && resp.AccessToken != nil { return *resp.AccessToken, nil } return "", fmt.Errorf("renew token failed") }

建议的续期策略:

  1. 缓存 Token 及其过期时间
  2. 在每次请求前检查 Token 是否即将过期
  3. 如即将过期,调用 RenewToken 接口续期
  4. 将新 Token 设置到 context 中继续使用

API 文档

完整的 API 文档请参考 docs 目录。

主要 API 模块

模块功能说明
TokenAPI访问令牌管理
- 创建访问令牌(CreateToken)
- 续期访问令牌(RenewToken)
- 删除访问令牌(DeleteToken)
- 删除用户所有令牌(DeleteUserTokens)
FileAPI文件操作
- 简单上传文件(SimpleUploadFile)
- 分块上传文件(MultipartUploadFile)
- 表单上传文件(FormUploadFile)
- 完成文件上传(CompleteFileUpload)
- 下载文件(DownloadFile)
- 获取文件信息(InfoFile)
- 复制文件(CopyFile)
- 移动文件(MoveFile)
- 删除文件(DeleteFile)
- 检查文件状态(CheckFileStatus)
- 获取文件上传信息(GetFileUpload)
- 续期分块上传(RenewMultipartUpload)
- 中止文件上传(AbortFileUpload)
- 创建符号链接(CreateSymlink)
- 文件预览(PreviewFile)
- 获取封面(GetCover)
- 文件转换(ConvertFile)
- 通过 iNode 获取文件信息(GetFileInfoByInode)
DirectoryAPI目录操作
- 创建目录(CreateDirectory)
- 列出目录内容(ListDirectory)
- 获取目录或文件信息(InfoFileOrDirectory)
- 复制目录(CopyDirectory)
- 移动目录(MoveDirectory)
- 删除目录(DeleteDirectory)
- 检查目录状态(CheckDirectoryStatus)
- 更新目录标签(UpdateDirectoryLabels)
- 更新文件标签(UpdateFileLabels)
SpaceAPI租户空间管理
- 创建空间(CreateSpace)
- 删除空间(DeleteSpace)
- 列出空间列表(ListSpace)
- 获取空间数量(GetLibrarySpaceCount)
- 获取空间大小(GetSpaceSize)
- 获取空间文件数量(GetFileCountInSpace)
- 获取空间扩展信息(GetSpaceExtension)
- 更新空间扩展信息(UpdateSpaceExtension)
- 获取空间内容视图(GetContentsView)
- 设置空间流量限制(SetSpaceTrafficLimit)
BatchAPI批量操作
- 批量复制(BatchCopy)
- 批量移动(BatchMove)
- 批量删除(BatchDelete)
QuotaAPI配额管理
- 创建配额(CreateQuota)
- 获取空间配额(GetQuota)
- 获取配额信息(GetQuotaInfo)
- 更新空间配额(UpdateQuota)
- 通过 ID 更新配额(UpdateQuotaById)
RecycledAPI回收站管理
- 列出回收站内容(RecycleList)
- 获取回收站项目信息(RecycleInfo)
- 恢复回收站项目(RecycleRestore)
- 批量恢复回收站项目(RecycleRestoreBatch)
- 永久删除回收站项目(RecyclePurge)
- 批量永久删除(RecyclePurgeBatch)
- 清空回收站(RecycleEmpty)
- 设置回收站生命周期(RecycleSetLifecycle)
- 预览回收站文件(RecyclePreview)
SearchAPI搜索功能
- 创建搜索任务(CreateSearch)
- 支持按文件名、标签、类型等条件搜索
- 支持搜索结果分页
FavoriteAPI收藏管理
- 添加收藏(CreateFavorite)
- 删除收藏(DeleteFavorite)
- 列出收藏列表(ListFavorite)
RecentAPI最近使用文件
- 列出最近使用的文件(ListRecentlyUsedFile)
HistoryAPI历史版本管理
- 列出文件历史版本(ListHistory)
- 删除历史版本(DeleteHistory)
- 设置为最新版本(SetHistoryLatest)
- 清空历史版本(EmptyHistory)
- 获取历史版本配置(GetHistoryConfig)
- 设置历史版本配置(SetHistoryConfig)
TaskAPI任务查询
- 查询空间任务(QueryTask)
- 查询媒体库任务(QueryLibraryTask)
UsageAPI容量统计
- 获取空间使用量(GetUsage)
- 获取媒体库使用量(GetLibraryUsage)

Transfer 模块

SDK 提供了高级的文件传输模块,支持:

上传功能

  • 简单上传:适用于小文件(默认 < 32MB)
  • 分块上传:适用于大文件(默认 ≥ 32MB),自动分块并发上传
  • 秒传:基于文件哈希(BeginningHash + FullHash)实现秒传
  • 进度回调:实时获取上传进度
  • 支持 Reader:支持从 io.Reader 上传,无需本地文件

下载功能

  • 简单下载:适用于小文件(默认 < 32MB)
  • 分块下载:适用于大文件(默认 ≥ 32MB),自动分块并发下载
  • 下载到文件:下载到本地文件路径
  • 下载到内存:下载到内存(适用于小文件)
  • 进度回调:实时获取下载进度

上传示例

package main import ( "context" "fmt" "os" client "cnb.cool/tencent/cloud/smh/smh-go-sdk" "cnb.cool/tencent/cloud/smh/smh-go-sdk/transfer" ) func main() { // 创建配置和客户端(参考上面的初始化步骤) cfg := client.NewConfiguration() cfg.Servers = client.ServerConfigurations{ {URL: "https://smhxxx.api.tencentsmh.cn"}, } ctx := context.Background() // 方式1: 从本地文件上传 uploadOptions := &transfer.UploadOptions{ LibraryID: "your-library-id", SpaceID: "your-space-id", FilePath: "/remote/path/file.txt", // 远端文件路径 LocalPath: "/local/path/file.txt", // 本地文件路径 AccessToken: "your-access-token", ChunkSize: 5, // 5MB 分块大小 PartFileSize: 32, // 超过 32MB 使用分块上传 Parallel: 3, // 3 个并发上传 OnProgress: func(progress float64) { fmt.Printf("\rUpload progress: %.2f%%", progress) }, } result, err := transfer.UploadFileFromPath(ctx, transfer.LocalFileOptions{}, uploadOptions, cfg) if err != nil { fmt.Printf("\nUpload failed: %v\n", err) os.Exit(1) } fmt.Printf("\nUpload completed! Name=%s, Inode=%s, Size=%s\n", result.Name, result.Inode, result.Size) // 方式2: 从 Reader 上传(适用于内存数据) content := []byte("Hello, SMH!") reader := bytes.NewReader(content) file := transfer.ReaderFileOptions{ Name: "hello.txt", Size: int64(len(content)), Reader: reader, } readerOptions := &transfer.UploadOptions{ LibraryID: "your-library-id", SpaceID: "your-space-id", FilePath: "/temp/hello.txt", AccessToken: "your-access-token", } result2, err := transfer.UploadFileFromReader(ctx, file, readerOptions, cfg) if err != nil { fmt.Printf("Reader upload failed: %v\n", err) os.Exit(1) } fmt.Printf("Reader upload completed! Name=%s, Inode=%s\n", result2.Name, result2.Inode) }

下载示例

package main import ( "context" "fmt" "os" client "cnb.cool/tencent/cloud/smh/smh-go-sdk" "cnb.cool/tencent/cloud/smh/smh-go-sdk/transfer" ) func main() { // 创建配置和客户端(参考上面的初始化步骤) cfg := client.NewConfiguration() cfg.Servers = client.ServerConfigurations{ {URL: "https://smhxxx.api.tencentsmh.cn"}, } ctx := context.Background() // 方式1: 下载到本地文件 downloadOptions := &transfer.DownloadOptions{ LibraryID: "your-library-id", SpaceID: "your-space-id", FilePath: "/remote/path/file.txt", // 远端文件路径 LocalPath: "/local/path/file.txt", // 本地保存路径 AccessToken: "your-access-token", ChunkSize: 10, // 10MB 分块大小 PartFileSize: 32, // 超过 32MB 使用分块下载 Parallel: 5, // 5 个并发下载 OnProgress: func(progress float64) { fmt.Printf("\rDownload progress: %.2f%%", progress) }, } err := transfer.DownloadFileToPath(ctx, downloadOptions, cfg) if err != nil { fmt.Printf("\nDownload failed: %v\n", err) os.Exit(1) } fmt.Printf("\nDownload completed! File saved to: %s\n", downloadOptions.LocalPath) // 方式2: 下载到内存(适用于小文件) memoryOptions := &transfer.DownloadToMemoryOptions{ LibraryID: "your-library-id", SpaceID: "your-space-id", FilePath: "/remote/path/config.json", AccessToken: "your-access-token", MaxSize: 10 * 1024 * 1024, // 最大 10MB OnProgress: func(progress float64) { fmt.Printf("\rDownload progress: %.2f%%", progress) }, } data, err := transfer.DownloadFileToMemory(ctx, memoryOptions, cfg) if err != nil { fmt.Printf("\nDownload to memory failed: %v\n", err) os.Exit(1) } fmt.Printf("\nDownloaded %d bytes\n", len(data)) fmt.Printf("Content: %s\n", string(data)) }

License

MIT License

About

腾讯云智能媒资托管(SMH) Go SDK

Language
Go100%