前期准备
开始操作前,确保您已经完成了 SDK 初始化。如果您还没有初始化 SDK,请先参考快速入门文档完成。
注意:
如果媒体库启用回收站功能,删除目录时会将目录及其下的文件移入回收站而非永久删除。
当目录内容较多时,复制操作会以异步方式执行,返回任务 ID。
列出目录内容
列出目录内容(marker 翻页,推荐)
listDirectory 用于获取指定目录下的所有文件和子目录,推荐使用 marker 方式翻页。// 使用 marker/limit 分页查询(推荐)const res = await smh.directory.listDirectory({libraryId: 'your-library-id',spaceId: 'your-space-id',filePath: '/images',byMarker: 1,limit: 20,orderBy: 'creationTime',orderByType: 'desc',filter: 'onlyFile',sortType: 'union',withInode: 0,withFavoriteStatus: 0,userId: 'xxx'});if (res.status === 200) {console.log('目录内容获取成功', res.data);}// 获取下一页:将上一次响应中的 nextMarker 作为 marker 传入const res2 = await smh.directory.listDirectory({libraryId: 'your-library-id',spaceId: 'your-space-id',filePath: '/images',byMarker: 1,marker: res.data.nextMarker,limit: 20});
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
libraryId | 媒体库 ID | String | 是 |
spaceId | 空间 ID | String | 是 |
filePath | 目录路径,对于多级目录,使用斜杠(/)分隔,例如 foo/bar | String | 是 |
byMarker | 固定传 1,表示使用 marker 方式分页 | Number | 是 |
marker | 用于顺序列出分页的标识,不传/为空则默认第一页 | String | 否 |
limit | 用于顺序列出分页时本地列出的项目数限制,不传默认 20,最大 1000 | Number | 否 |
orderBy | 排序字段,可选值:name、modificationTime、size、creationTime、localCreationTime | String | 否 |
orderByType | 排序方式,升序为 asc,降序为 desc | String | 否 |
filter | 筛选方式,不传返回全部,onlyDir 只返回文件夹,onlyFile 只返回文件 | String | 否 |
sortType | 排序方式,不传则文件和文件夹单独排序,先返回文件夹后返回文件。union 文件和文件夹拉通排序 | String | 否 |
withInode | 是否返回 inode(文件目录 ID),0 或 1,默认不返回 | Number | 否 |
withFavoriteStatus | 是否返回收藏状态,0 或 1,默认不返回 | Number | 否 |
userId | 用户身份识别,当访问令牌对应的权限为管理员权限且申请访问令牌时的用户身份识别为空时用来临时指定用户身份 | String | 否 |
返回值说明:
HTTP 状态码:200,获取成功,返回目录内容列表。
字段 | 说明 | 类型 |
path | 返回当前请求的目录结构,如果当前请求的是根目录,则该字段为空数组 | Array |
nextMarker | 用于顺序列出分页的标识,为空表示已翻页完毕 | String |
contents | 目录内容列表 | Array |
响应示例:
{"path": ["foo", "bar"],"nextMarker": "eyJ0eXBlIjoiZmlsZSIsIm5hbWUiOiJCTVcwLjMyNTE0NTE4ODkzMDYxNjk1LmpwZyJ9","contents": [{"name": "sub-dir1","path": ["foo", "bar", "sub-dir1"],"inode": "xxxx","type": "dir","creationTime": "2020-09-22T07:43:01.000Z","modificationTime": "2020-09-22T07:43:01.000Z","eTag": "0","isFavorite": true,"labels": ["动物", "大象", "亚洲象"]},{"name": "file1.jpg","type": "file","creationTime": "2020-09-22T07:44:45.000Z","modificationTime": "2020-09-22T07:44:45.000Z","versionId": 2,"contentType": "image/jpg","size": "1048576","eTag": "xxx","isFavorite": false,"crc64": "xxx","metaData": {"x-smh-meta-foo": "bar"},"fileType": "powerpoint","previewByDoc": true,"previewByCI": true,"previewAsIcon": true,"category": "image","labels": ["动物", "大象", "亚洲象"],"localCreationTime": "2020-09-22T07:44:45.000Z","localModificationTime": "2020-09-22T07:44:45.000Z"}]}
contents 数组元素字段说明:
字段 | 说明 | 类型 |
name | 目录或相簿名或文件名 | String |
path | 文件具体目录 | Array |
inode | 文件目录 ID | String |
type | 条目类型:dir、file、image、video、symlink、virtual | String |
versionId | 版本号 | Number |
creationTime | ISO 8601 格式的日期与时间字符串 | String |
modificationTime | ISO 8601 格式的日期与时间字符串 | String |
contentType | 媒体类型 | String |
size | 文件大小,字符串格式以避免精度问题 | String |
eTag | 子目录或文件的 ETag | String |
isFavorite | 是否被收藏,当 withFavoriteStatus = 1 时返回 | Boolean |
crc64 | 文件的 CRC64-ECMA182 校验值 | String |
metaData | 文件元数据信息 | Object |
previewByDoc | 是否可通过 wps 预览 | Boolean |
previewByCI | 是否可通过万象预览 | Boolean |
previewAsIcon | 是否可用预览图作为 icon | Boolean |
fileType | 文件类型:excel、powerpoint 等 | String |
category | 文件分类,比如 image、video、doc 等 | String |
labels | 简易文件标签,字符串数组 | Array |
localCreationTime | 文件对应的本地创建时间 | String |
localModificationTime | 文件对应的本地修改时间 | String |
removedByQuota | 是否因配额超限被删除 | Boolean |
contentCas | 内容 CAS 标识,当 withContentCas=1 时返回 | String |
列出目录内容(传统分页,不推荐)
listDirectoryByPage 使用传统分页方式列出目录内容,不建议深翻页。// 使用 page/pageSize 分页查询(传统分页,不建议深翻)const res = await smh.directory.listDirectoryByPage({libraryId: 'your-library-id',spaceId: 'your-space-id',filePath: '/documents',byPage: 1,page: 1,pageSize: 20,orderBy: 'name',orderByType: 'asc',filter: 'onlyFile',sortType: 'union',withInode: 1,withFavoriteStatus: 1,userId: 'xxx'});if (res.status === 200) {console.log('目录内容获取成功', res.data);}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
libraryId | 媒体库 ID | String | 是 |
spaceId | 空间 ID | String | 是 |
filePath | 目录路径,对于多级目录,使用斜杠(/)分隔 | String | 是 |
byPage | 固定传 1,表示使用 page 方式分页 | Number | 是 |
page | 分页码,默认 1,最大翻页条目数(page*pageSize)为 10000 | Number | 否 |
pageSize | 分页大小,默认 20,最大翻页条目数(page*pageSize)为 10000 | Number | 否 |
orderBy | 排序字段,可选值:name、modificationTime、size、creationTime、localCreationTime | String | 否 |
orderByType | 排序方式,升序为 asc,降序为 desc | String | 否 |
filter | 筛选方式,不传返回全部,onlyDir 只返回文件夹,onlyFile 只返回文件 | String | 否 |
sortType | 排序方式,不传则文件和文件夹单独排序,先返回文件夹后返回文件。union 文件和文件夹拉通排序 | String | 否 |
withInode | 是否返回 inode(文件目录 ID),0 或 1,默认不返回 | Number | 否 |
withFavoriteStatus | 是否返回收藏状态,0 或 1,默认不返回 | Number | 否 |
userId | 用户身份识别 | String | 否 |
返回值说明:
HTTP 状态码:200,获取成功,返回目录内容列表。
字段 | 说明 | 类型 |
path | 返回当前请求的目录结构 | Array |
fileCount | 当前目录中的文件数(不包含孙子级) | Number |
subDirCount | 当前目录中的子目录数(不包含孙子级) | Number |
totalNum | 当前目录中的所有文件和子目录数量(不包含孙子级) | Number |
contents | 目录内容列表 | Array |
目录信息
查看目录详情
infoFileOrDirectory 用于获取指定路径的详细信息,可同时用于查看文件或文件夹详情。// 获取目录详情const res = await smh.directory.infoFileOrDirectory({spaceId: 'your-space-id',filePath: '/documents',info: 1,withInode: 1,withFavoriteStatus: 1});if (res.status === 200) {console.log('详情获取成功', res.data);}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件或目录路径 | String | 是 |
info | 固定为 1 | Number | 是 |
withInode | 是否返回 inode(文件目录 ID),0 或 1,默认不返回 | Number | 否 |
withFavoriteStatus | 是否返回收藏状态,0 或 1,默认不返回 | Number | 否 |
userId | 用户身份识别 | String | 否 |
返回值说明:
HTTP 状态码:200,获取成功,返回详细信息。
字段 | 说明 | 类型 |
path | 完整路径 | Array |
inode | 文件目录 ID | String |
name | 目录或相簿名或文件名 | String |
type | 条目类型:dir、file、image、video、symlink、virtual | String |
userId | 创建人 ID | String |
creationTime | ISO 8601 格式的日期与时间字符串 | String |
modificationTime | ISO 8601 格式的日期与时间字符串 | String |
eTag | 目录或文件的 ETag | String |
isFavorite | 是否被收藏,当 withFavoriteStatus = 1 时返回 | Boolean |
labels | 简易文件标签列表 | Array |
category | 文件自定义的分类 | String |
linkTo | 符号链接指向的下一级文件的 inode,当文件为符号链接时返回 | String |
检查目录状态
checkDirectoryStatus 用于检查指定目录是否存在。const res = await smh.directory.checkDirectoryStatus({spaceId: 'your-space-id',filePath: '/documents',userId: 'xxx'});if (res.status === 200) {console.log('目录存在');}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目录路径 | String | 是 |
userId | 用户身份识别 | String | 否 |
返回值说明:
HTTP 状态码:200,目录或相簿存在。
查询目录统计数据
getDirectoryStats 用于获取指定目录下的文件总大小、文件数量以及子目录数量,支持查询普通目录、回收站目录以及历史版本的统计量。// 查询普通目录的统计数据const res = await smh.directory.getDirectoryStats({spaceId: 'your-space-id',filePath: '/documents',stats: 1,statsType: 'normal',userId: 'xxx'});if (res.status === 200) {console.log('目录统计获取成功', res.data);}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目录路径,对于多级目录使用斜杠(/)分隔;对于根目录该参数留空 | String | 是 |
stats | 固定值为 1,表示查询目录统计数据 | Number | 是 |
statsType | 统计类型,normal 表示普通目录统计量,recycle 表示回收站目录统计量,history 表示目录的历史版本统计量 | String | 是 |
recycledId | 回收站项目 ID,查询回收站的统计量时为必选参数(根目录除外) | String | 否 |
userId | 用户身份识别 | String | 否 |
返回值说明:
HTTP 状态码:200,查询成功,返回目录统计信息。
字段 | 说明 | 类型 |
userId | 创建人 ID | String |
statsType | 查询类型,可选值:normal、recycle、history | String |
storage | 目录下所有文件总大小(字节),包含子目录文件 | Number |
fileCount | 目录下所有文件数量,包含子目录文件 | Number |
dirCount | 目录下所有子目录数量 | Number |
修正目录统计数据
calibrateDirectoryStats 用于修正指定目录的统计数据,支持普通目录、回收站目录以及历史版本的统计量修正。修正操作以异步任务方式执行(HTTP 200 返回 taskId),可通过任务管理接口查询任务执行结果。该接口有调用频率限制,修正期间建议减少写操作,否则结果可能有偏差。需要 admin 或 space_admin 权限。const res = await smh.directory.calibrateDirectoryStats({spaceId: 'your-space-id',filePath: '/documents',calibrate: 1,statsType: 'normal',userId: 'xxx'});if (res.status === 200) {console.log('修正任务已提交,任务ID:', res.data.taskId);// 通过任务管理接口轮询任务执行结果}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目录路径,对于多级目录使用斜杠(/)分隔;对于根目录该参数留空 | String | 是 |
calibrate | 固定值为 1,表示修正目录统计数据 | Number | 是 |
statsType | 统计类型,normal 表示普通目录统计量,recycle 表示回收站目录统计量,history 表示目录的历史版本统计量 | String | 是 |
recycledId | 回收站项目 ID,查询回收站的统计量时为必选参数(根目录除外) | String | 否 |
userId | 用户身份识别 | String | 否 |
返回值说明:
HTTP 状态码:200,修正任务已提交,异步执行。
字段 | 说明 | 类型 |
taskId | 异步修正任务 ID,可通过任务管理接口查询任务执行结果 | Number |
目录管理
创建目录
createDirectory 用于在指定路径创建新的目录,会自动创建中间所需的各级父目录。const res = await smh.directory.createDirectory({spaceId: 'your-space-id',filePath: '/project-docs',conflictResolutionStrategy: 'rename',withInode: 1,createDirectoryRequest: {metaData: {'department': 'engineering','project': 'sdk-v2',},labels: ['重要', '项目文档'],localCreationTime: '2024-01-15T10:30:00+08:00',localModificationTime: '2024-01-15T10:30:00+08:00',},});if (res.status === 201) {console.log('目录创建成功', res.data);}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目录路径 | String | 是 |
conflictResolutionStrategy | 最后一级目录冲突时的处理方式,ask: 冲突时返回 HTTP 409,rename: 冲突时自动重命名,默认为 ask | String | 否 |
withInode | 是否返回 inode(文件目录 ID),0 或 1,默认不返回 | Number | 否 |
userId | 用户身份识别 | String | 否 |
createDirectoryRequest | 可选的请求体,用于指定目录的元数据信息 | Object | 否 |
createDirectoryRequest 对象说明:
字段 | 参数描述 | 类型 | 是否必填 |
metaData | 自定义元数据键值对,key 为小写字符串 | Object | 否 |
labels | 目录标签列表 | Array | 否 |
localCreationTime | 目录对应的本地创建时间 | String | 否 |
localModificationTime | 目录对应的本地修改时间 | String | 否 |
返回值说明:
HTTP 状态码:201,创建成功。
字段 | 说明 | 类型 |
path | 最终的目录或相簿路径,可能因自动重命名与指定路径不同 | Array |
inode | 最后一级文件目录 ID | String |
复制目录
copyDirectory 用于将目录复制到目标路径,会自动创建中间所需的各级父目录。当目录内容较多时以异步方式复制。// 复制(目录内容较多)const res = await smh.directory.copyDirectory({spaceId: 'your-space-id',filePath: '/dest/image.png',conflictResolutionStrategy: 'ask',userId: 'xxx',copyDirectoryRequest: {copyFrom: '/source/xxx'}});if (res.status === 202) {console.log('异步复制任务创建成功', res.data);}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目标目录路径 | String | 是 |
conflictResolutionStrategy | 最后一级目录冲突时的处理方式,ask 或 rename,默认为 ask | String | 否 |
userId | 用户身份识别 | String | 否 |
copyDirectoryRequest | 复制目录请求对象 | Object | 是 |
copyDirectoryRequest 对象说明:
字段 | 参数描述 | 类型 | 是否必填 |
copyFrom | 被复制的源目录或相簿路径 | String | 是 |
返回值说明:
HTTP 状态码 202:目录内容较多,以异步方式复制,返回 taskId。
HTTP 状态码 204:同步复制成功(conflictResolutionStrategy 为 ask)。
HTTP 状态码 200:同步复制成功(conflictResolutionStrategy 为 rename),返回最终路径。
重命名或移动目录
moveDirectory 用于将目录移动到目标路径或重命名目录,可跨越多层级多目录。要求权限:admin、space_admin 或 move_directory。const res = await smh.directory.moveDirectory({spaceId: 'your-space-id',filePath: '/dest/image.png',conflictResolutionStrategy: 'ask',userId: 'xxx',moveDirectoryRequest: {from: '/source/image.png'}});if (res.status === 204) {console.log('目录移动成功');}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目标目录路径 | String | 是 |
conflictResolutionStrategy | 最后一级目录冲突时的处理方式,ask 或 rename,默认为 ask | String | 否 |
userId | 用户身份识别 | String | 否 |
moveDirectoryRequest | 移动目录请求对象 | Object | 是 |
moveDirectoryRequest 对象说明:
字段 | 参数描述 | 类型 | 是否必填 |
from | 被重命名或移动的源目录或相簿路径 | String | 是 |
返回值说明:
HTTP 状态码 204:重命名或移动成功(conflictResolutionStrategy 为 ask)。
HTTP 状态码 200:重命名或移动成功(conflictResolutionStrategy 为 rename),返回最终路径。
删除目录
deleteDirectory 用于删除指定目录及其下的所有文件。如果媒体库启用回收站功能,则移入回收站而非永久删除。// 移入回收站const res = await smh.directory.deleteDirectory({spaceId: 'your-space-id',filePath: '/old-folder',permanent: 0,userId: 'xxx'});if (res.status === 200) {console.log('目录已移入回收站,回收站项目 ID:', res.data.recycledItemId);} else if (res.status === 204) {console.log('目录已永久删除');}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目录路径 | String | 是 |
permanent | 当媒体库开启回收站时,1: 永久删除,0: 移入回收站,默认为 0 | Number | 否 |
userId | 用户身份识别 | String | 否 |
返回值说明:
HTTP 状态码 204:删除成功(未开启回收站)。
HTTP 状态码 200:删除成功(开启回收站),返回回收站项目 ID。
字段 | 说明 | 类型 |
recycledItemId | 回收站项目 ID | Number |
标签与分类
更新目录标签
updateDirectoryLabels 用于更新目录的标签信息。需要 admin 或 space_admin 权限。const res = await smh.directory.updateDirectoryLabels({spaceId: 'your-space-id',filePath: '/documents',update: 1,updateDirectoryLabelsRequest: {labels: ['tag1', 'tag2', 'important']}});if (res.status === 204) {console.log('目录标签更新成功');}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目录路径 | String | 是 |
update | 固定为 1 | Number | 是 |
updateDirectoryLabelsRequest | 更新目录标签请求对象 | Object | 是 |
updateDirectoryLabelsRequest 对象说明:
字段 | 参数描述 | 类型 | 是否必填 |
labels | 文件标签列表 | Array | 否 |
metaData | 自定义元数据键值对 | Object | 否 |
metaDataDirective | 元数据更新策略:merge(默认,合并,key 设为 null 删除该 key)、replace(全量替换 metaData,labels 不受影响) | String | 否 |
返回值说明:
HTTP 状态码:204,更新成功,无响应体。
更新文件标签或分类
updateFileLabels 用于更新文件的标签(Labels)或分类(Category)。需要 admin 或 space_admin 权限。// 更新文件标签和分类const res = await smh.directory.updateFileLabels({spaceId: 'your-space-id',filePath: 'text.txt',update: 1,updateFileLabelsRequest: {labels: ['动物', '大象', '亚洲象'],category: 'image',localCreationTime: '2022-07-26T02:58:09Z',localModificationTime: '2022-07-26T02:58:09Z'}});if (res.status === 204) {console.log('文件标签更新成功');}
参数说明:
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
update | 固定为 1 | Number | 是 |
updateFileLabelsRequest | 更新文件标签请求对象 | Object | 是 |
updateFileLabelsRequest 对象说明:
字段 | 参数描述 | 类型 | 是否必填 |
labels | 文件标签列表 | Array | 否 |
category | 文件自定义的分类,最大长度 16 字节 | String | 否 |
localCreationTime | 文件对应的本地创建时间 | String | 否 |
localModificationTime | 文件对应的本地修改时间 | String | 否 |
metaData | 自定义元数据键值对 | Object | 否 |
metaDataDirective | 元数据更新策略:merge(默认)、replace | String | 否 |
contentType | 媒体类型 | String | 否 |
size | 虚拟文件大小(字节),字符串格式,仅对虚拟文件生效,更新后重新计算配额 | String | 否 |
返回值说明:
HTTP 状态码:204,更新成功,无响应体。