腾讯云智能媒资托管(Smart Media Hosting)Go SDK
go get cnb.cool/tencent/cloud/smh/smh-go-sdk
⚠️ 重要说明
在使用 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)
}
// 获取访问令牌
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)
}
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")
}
建议的续期策略:
- 缓存 Token 及其过期时间
- 在每次请求前检查 Token 是否即将过期
- 如即将过期,调用 RenewToken 接口续期
- 将新 Token 设置到 context 中继续使用
完整的 API 文档请参考 docs 目录。
| 模块 | 功能说明 |
|---|---|
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) |
SDK 提供了高级的文件传输模块,支持:
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))
}
MIT License