前期准备
开始操作前,确保您已经完成了 SDK 初始化。如果您还没有初始化 SDK,请先参考快速入门文档完成。
注意:
如果媒体库启用回收站功能,删除文件时会移入回收站而非永久删除。
符号链接所指向的文件不会因为重命名或移动而丢失指向。
文件信息
获取文件信息
infoFile 用于获取文件的详细信息和下载链接,支持获取历史版本文件信息。// 获取文件详细信息const res = await smh.file.infoFile({spaceId: 'your-space-id',filePath: '/test.xlsx',info: 1,historyId: '123',purpose: 'preview',});if (res.status === 200) {console.log('文件信息获取成功', res.data);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
info | 获取文件信息标识,固定为 1 | Number | 是 |
historyId | 历史版本 ID,用于获取不同版本的文件内容,不传默认为最新版 | String | 否 |
contentDisposition | 响应头 Content-Disposition,支持 inline 或 attachment,默认为 inline | String | 否 |
purpose | 用途,可设置为 download 或 preview | String | 否 |
userId | 用户身份识别 | String | 否 |
trafficLimit | 单链接下载限速,范围 100KB/s-100MB/s,单位 B | Number | 否 |
preCheck | 是否只用于校验文件是否可预览和下载,设置后返回结果中不包含 cosUrl | Number | 否 |
withShortLink | 0 或 1,设置为 1 时返回的 cosUrl 将被替换为短链形式 | Number | 否 |
period | 下载/预览链接有效期(秒),范围 [60, 7200],默认 7200 | Number | 否 |
withFavoriteStatus | 0 或 1,设置为 1 时返回结果中包含收藏状态 | Number | 否 |
preview | 0 或 1,设置为 1 时返回结果中包含在线预览链接 | Number | 否 |
返回值说明
字段 | 说明 | 类型 |
cosUrl | 带签名的下载链接 | String |
type | 文件类型 | String |
creationTime | 文件首次完成上传的时间 | String |
modificationTime | 文件最近一次被覆盖的时间 | String |
contentType | 媒体类型 | String |
size | 文件大小(字符串格式) | String |
eTag | 文件 ETag | String |
crc64 | 文件的 CRC64-ECMA182 校验值 | String |
fileType | 文件类型:excel、powerpoint 等 | String |
previewByDoc | 是否可通过 wps 预览 | Boolean |
previewByCI | 是否可通过万象预览 | Boolean |
previewAsIcon | 是否可用预览图当做 icon | Boolean |
metaData | 元数据 | Object |
labels | 简易文件标签列表 | Array |
category | 文件自定义的分类 | String |
localCreationTime | 文件对应的本地创建时间 | String |
localModificationTime | 文件对应的本地修改时间 | String |
versionId | 文件版本号 | Number |
获取照片/视频封面缩略图
getCover 用于获取文件的封面图片或视频帧,支持指定尺寸和缩放比例。const res = await smh.file.getCover({spaceId: 'your-space-id',filePath: '/video.mp4',preview: 1,size: 256,scale: 12,widthSize: 256,heightSize: 256,frameNumber: 1});// 服务端返回 302,axios 会自动跟随跳转,res.status 为最终响应的 200// 浏览器端无法禁用自动跟随;如需封面 URL 本身,请改用 infoFile 获取 cosUrl,// 或直接把本接口的请求地址交给 <img src> 使用(浏览器会自动跳转)console.log('封面获取成功,状态码:', res.status);
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
preview | 预览标识,固定为 1 | Number | 是 |
userId | 用户身份识别 | String | 否 |
size | 缩略图尺寸(像素) | Number | 否 |
scale | 缩放比例 | Number | 否 |
widthSize | 宽度尺寸(像素) | Number | 否 |
heightSize | 高度尺寸(像素) | Number | 否 |
frameNumber | 视频帧号 | Number | 否 |
返回值:服务端返回 HTTP 302 并通过 Location 重定向到封面图片 URL;axios 会自动跟随跳转,客户端实际观察到的 res.status 为 200,响应体为图片内容。
获取文档预览
previewFile 用于获取 HTML 格式或图片格式的文档预览,支持 PPT、Word、Excel 等文档类型。// 获取 HTML 格式预览const res = await smh.file.previewFile({spaceId: 'your-space-id',filePath: '/foo/bar.pptx',preview: 1,type: 'html',});// 服务端返回 302,axios 会自动跟随跳转,res.status 为最终响应的 200// 如需在页面中展示预览,可直接把本接口的请求地址用于 <iframe src>(HTML 预览)// 或 <img src>(type 为 pic 时的 JPG 预览),浏览器会自动跳转console.log('预览获取成功,状态码:', res.status);
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
preview | 预览标识,固定为 1 | Number | 是 |
historyId | 历史版本 ID | String | 否 |
type | 预览类型,html 或 pic | String | 否 |
userId | 用户身份识别 | String | 否 |
返回值:服务端返回 HTTP 302 并通过 Location 重定向到预览内容(HTML 或 JPG);axios 会自动跟随跳转,客户端实际观察到的 res.status 为 200。
检查文件状态
checkFileStatus 用于检查文件是否存在。const res = await smh.file.checkFileStatus({spaceId: 'your-space-id',filePath: '/test.xlsx',});if (res.status === 200) {console.log('文件存在');}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
historyId | 历史版本 ID | String | 否 |
userId | 用户身份识别 | String | 否 |
返回值:HTTP 200,文件存在。
根据 inode 获取文件信息
getFileInfoByInode 通过文件的 inode 查询文件详细信息。const res = await smh.file.getFileInfoByInode({spaceId: 'your-space-id',inode: '46bb40dd044f66340006425bd913af6f'});if (res.status === 200) {console.log('文件信息获取成功', res.data);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
inode | 文件 inode | String | 是 |
返回值:HTTP 200,返回文件详细信息。
文件管理
复制文件
copyFile 将文件复制到目标路径。const res = await smh.file.copyFile({spaceId: 'your-space-id',filePath: '/dest/test.xlsx',conflictResolutionStrategy: 'rename',copyFileRequest: {copyFrom: '/test.xlsx'}});if (res.status === 200) {console.log('文件复制成功', res.data);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目标文件路径 | String | 是 |
conflictResolutionStrategy | 冲突处理方式 | String | 否 |
userId | 用户身份识别 | String | 否 |
copyFileRequest.copyFrom | 源文件路径 | String | 是 |
重命名或移动文件
moveFile 将文件移动到目标路径或重命名文件。const res = await smh.file.moveFile({spaceId: 'your-space-id',filePath: '/dest/test.xlsx',conflictResolutionStrategy: 'rename',moveFileRequest: {from: '/test.xlsx'}});if (res.status === 200) {console.log('文件移动成功', res.data);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目标文件路径 | String | 是 |
conflictResolutionStrategy | 冲突处理方式 | String | 否 |
userId | 用户身份识别 | String | 否 |
moveFileRequest.from | 源文件路径 | String | 是 |
删除文件
deleteFile 删除指定文件。如果媒体库启用了回收站功能,则文件会被移入回收站而非永久删除。// 移入回收站const res = await smh.file.deleteFile({spaceId: 'your-space-id',filePath: '/test.xlsx',permanent: 0,});if (res.status === 200) {console.log('文件已移入回收站', res.data);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
permanent | 1: 永久删除,0: 移入回收站(默认) | Number | 否 |
userId | 用户身份识别 | String | 否 |
创建符号链接
createSymlink 创建指向其他文件的符号链接,所指向的文件不会因重命名或移动而丢失指向。const res = await smh.file.createSymlink({spaceId: 'your-space-id',filePath: '/test.xlsx',conflictResolutionStrategy: 'rename',createSymlinkRequest: {linkTo: '/dest/test.xlsx'}});if (res.status === 200) {console.log('符号链接创建成功', res.data);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 符号链接路径 | String | 是 |
conflictResolutionStrategy | 冲突处理方式 | String | 否 |
userId | 用户身份识别 | String | 否 |
createSymlinkRequest.linkTo | 指向的源文件绝对路径 | String | 是 |
文档转码
convertFile 将文档转换为其他格式,支持异步转码任务。const res = await smh.file.convertFile({spaceId: 'your-space-id',filePath: '/dest/test.pdf', // 目标文件路径convert: 1,conflictResolutionStrategy: 'rename',convertFileRequest: {convertFrom: '/documents/test.docx' // 源文件路径}});if (res.status === 202) {console.log('转码任务已提交,任务ID:', res.data.taskId);// 通过任务管理接口轮询转码结果}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 目标文件路径 | String | 是 |
convert | 转码标识,固定为 1 | Number | 是 |
conflictResolutionStrategy | 冲突处理方式 | String | 否 |
userId | 用户身份识别 | String | 否 |
convertFileRequest.convertFrom | 源文件路径 | String | 是 |
查询文件删除原因
checkFileDeletion 查询文件被删除的原因(用户主动删除或 quota 超限删除)。要求权限:admin 或 space_admin。const res = await smh.file.checkFileDeletion({spaceId: 'your-space-id',inode: '46bb40dd044f66340006425bd913af6f'});if (res.status === 200) {console.log('删除信息:', res.data);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
inode | 文件的 Inode | String | 是 |
返回值:HTTP 200,返回 reason(RemovedByQuota/Unknown)、deletedAt、quotaCleanupRecordRetentionDays。
获取最近使用文件
注意:
若您使用获取最近使用文件功能,需要具有空间的读权限。
功能说明
listRecentlyUsedFile 实现获取用户最近使用的文件列表,支持按操作类型、文件类型等条件进行过滤,并可选择是否返回文件完整路径。使用示例
const res = await smh.recent.listRecentlyUsedFile({spaceId: 'your-space-id',listRecentlyUsedFileRequest: {marker: 'xxx',limit: 20,filterActionBy: 'preview',type: ['pdf', 'word'],withPath: true}});if (res.status === 200) {console.log('获取最近使用文件成功', res.data);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
listRecentlyUsedFileRequest | 获取最近使用文件请求对象 | Object | 是 |
listRecentlyUsedFileRequest 对象说明
字段 | 参数描述 | 类型 | 是否必填 |
marker | 用于顺序列出分页的标识,不传默认第一页 | String | 否 |
limit | 用于顺序列出分页时本地列出的项目数限制,不传则默认 20 | Number | 否 |
filterActionBy | 筛选操作方式,不传返回全部。可选值:preview(只返回预览操作)、modify(返回编辑操作) | String | 否 |
type | 筛选文件类型,字符串或字符串数组 | String / Array | 否 |
withPath | 是否返回文件的完整路径信息,默认为 false | Boolean | 否 |
文件类型说明(type 参数)
预定义类型
类型值 | 描述 | 包含的文件扩展名 |
all | 搜索所有文件(默认值) | 所有文件类型 |
document | 搜索所有文档 | pdf、powerpoint、excel、word、text 类型 |
pdf | 仅搜索 PDF 文档 | .pdf |
powerpoint | 仅搜索演示文稿 | .ppt、.pptx、.pot、.potx 等 |
excel | 仅搜索表格文件 | .xls、.xlsx、.ett、.xltx、.csv 等 |
word | 仅搜索文档 | .doc、.docx、.dot、.wps、.wpt 等 |
text | 仅搜索纯文本 | .txt、.asp、.htm 等 |
使用示例:
// 使用预定义类型type: 'document'// 使用预定义类型数组type: ['pdf', 'word', 'excel']// 使用文件扩展名数组type: ['.pdf', '.doc', '.xlsx']
返回值说明
HTTP 状态码:200
请求成功,返回最近使用文件列表。
响应示例
{"nextMarker": "xxx","contents": [{"name": "文档.docx","spaceId": "space-id-1","inode": "xxxxx","size": "2048576","actionType": "preview","operationTime": "2025-12-03T10:30:00Z","creationTime": "2025-12-01T08:00:00Z","crc64": "xxxxxx","path": ["folder1", "文档.doc"]}]}
响应字段说明
字段 | 说明 | 类型 |
nextMarker | 用于顺序列出分页的标识 | String |
contents | 最近使用文件列表 | Array |
contents 数组元素说
字段 | 说明 | 类型 |
name | 文件名 | String |
spaceId | 空间 ID | String |
inode | 文件 ID | String |
size | 文件大小(字节),字符串格式 | String |
actionType | 操作类型:preview、modify | String |
operationTime | 加入最近使用文件列表的时间 | String |
creationTime | 文件的上传时间 | String |
crc64 | 文件的 CRC64-ECMA182 校验值 | String |
path | 文件路径,仅当 withPath 为 true 时返回 | Array |
创建虚拟文件
createVirtualFile 在指定路径创建一个不包含实际内容的虚拟文件记录,可设置媒体类型、元数据、标签、分类和大小。虚拟文件不对应实际的 COS 对象存储,仅保存元数据信息,可用于占位或记录外部资源引用;不支持上传、下载、预览和转码。// 创建最简单的虚拟文件const res = await smh.file.createVirtualFile({spaceId: 'your-space-id',filePath: '/documents/reference.vfile',virtualFile: 1,});
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
virtualFile | 固定标识,固定值为 1 | Number | 是 |
conflictResolutionStrategy | 冲突处理方式 | String | 否 |
userId | 用户身份识别 | String | 否 |
createVirtualFileRequest.contentType | 虚拟文件的媒体类型 | String | 否 |
createVirtualFileRequest.metaData | 自定义元数据键值对 | Object | 否 |
createVirtualFileRequest.labels | 文件标签列表 | Array | 否 |
createVirtualFileRequest.category | 文件自定义分类 | String | 否 |
createVirtualFileRequest.size | 虚拟文件大小(字节),默认 "0",非零值会占用空间配额 | String | 否 |
文件收藏
文件收藏
注意:
若您使用收藏管理功能,需要具有相应空间的读写权限,且初始化创建 access_token 时必须要传 userId,否则会没有权限。
功能说明
createFavorite 实现收藏指定空间的文件或目录。支持通过文件路径或文件 ID(inode)进行收藏操作。使用示例
// 通过路径收藏const res = await smh.favorite.createFavorite({spaceId: 'your-space-id',createFavoriteRequest: {path: '/documents/report.docx'}});// 通过 inode 收藏const res2 = await smh.favorite.createFavorite({spaceId: 'your-space-id',createFavoriteRequest: {inode: '46bb40dd044f66340006425bd913af6f'}});
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID,如果媒体库为单租户模式,则该参数固定为连字符(-);如果媒体库为多租户模式,则必须指定该参数 | String | 是 |
createFavoriteRequest | 收藏请求对象 | Object | 是 |
createFavoriteRequest 对象说明
字段 | 参数描述 | 类型 | 是否必填 |
path | 文件或目录的路径 | String | 否 |
inode | 文件或目录的 ID | String | 否 |
注意:
path 和 inode 二选一,至少提供一个;如果同时提供,以 inode 为准。
返回值说明
HTTP 状态码:200
收藏成功,返回文件或目录的 ID。
响应示例
{"inode": "46bb40dd044f66340006425bd913af6f"}
响应字段说明
字段 | 说明 | 类型 |
inode | 文件或目录的 ID | String |
查看收藏列表
注意:
若您使用收藏管理功能,需要具有相应空间的读写权限,且初始化创建 access_token 时必须要传 userId,否则会没有权限。
查看收藏列表支持两种分页方式:marker/limit 方式和 page/pageSize 方式,两种方式不能同时使用。
功能说明
listFavorite 实现查看指定空间的收藏列表,支持分页、排序和路径返回等功能。使用示例
// 使用 marker/limit 分页方式const res = await smh.favorite.listFavorite({spaceId: 'your-space-id',marker: 'xxx',limit: 20,orderBy: 'favoriteTime',orderByType: 'desc',withPath: true});if (res.status === 200) {console.log('获取收藏列表成功', res.data);console.log('下一页标识:', res.data.nextMarker);res.data.contents.forEach(item => {console.log(`文件名: ${item.name}, 收藏时间: ${item.favoriteTime}`);});}// 使用 page/pageSize 分页方式const res2 = await smh.favorite.listFavorite({spaceId: 'your-space-id',page: 1,pageSize: 20,orderBy: 'favoriteTime',orderByType: 'desc'});if (res2.status === 200) {console.log('总数:', res2.data.totalNum);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID,如果媒体库为单租户模式,则该参数固定为连字符(-);如果媒体库为多租户模式,则必须指定该参数 | String | 是 |
marker | 用于顺序列出分页的标识,不传默认第一页。不能与 page、pageSize 参数同时使用 | String | 否 |
limit | 用于顺序列出分页时本地列出的项目数限制,默认为 20。不能与 page、pageSize 参数同时使用 | Number | 否 |
page | 分页码,默认第一页。不能与 marker、limit 参数同时使用 | Number | 否 |
pageSize | 分页大小,默认 20。不能与 marker、limit 参数同时使用 | Number | 否 |
orderBy | 排序字段,按收藏时间排序为 favoriteTime(默认),目前仅支持按收藏时间排序 | String | 否 |
orderByType | 排序方式,升序为 asc,降序为 desc(默认) | String | 否 |
withPath | 是否返回文件路径, true 表示返回,false 表示不返回(默认) | Boolean | 否 |
返回值说明
HTTP 状态码:200
获取成功,返回收藏列表。
响应示例
{"nextMarker": "xxx","totalNum": 50,"contents": [{"spaceId": "space-id-1","type": "file","inode": "46bb40dd044f66340006425bd913af6f","name": "文档.docx","size": "2048576","creationTime": "2025-12-01T08:00:00Z","modificationTime": "2025-12-02T10:30:00Z","favoriteTime": "2025-12-03T14:20:00Z","fileType": "document","path": ["文档", "文档.docx"],"userId": "test-user-id","eTag": "abc123def456","contentType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document","crc64": "1234567890123456789","previewByDoc": true,"previewByCI": false,"previewAsIcon": true}]}
响应字段说明
字段 | 说明 | 类型 |
nextMarker | 用于顺序列出分页的标识,仅当使用 marker/limit 方式分页且当前不为最后一页时会返回 | String |
totalNum | 收藏文件目录的总数,仅当使用 page/pageSize 方式分页时会返回 | Number |
contents | 收藏的文件目录集合,数组格式 | Array |
contents 数组元素说明
字段 | 说明 | 类型 |
spaceId | 空间 ID | String |
type | 文件目录类型,可选值: dir(目录)、file(文件)。如果文件已被删除,则不返回该字段 | String |
inode | 文件或目录 ID | String |
name | 文件或目录名称。如果文件已被删除,则返回空字符串 | String |
size | 文件的大小(单位:字节)。如果为目录或文件已被删除,则不返回该字段 | String |
creationTime | 文件或目录的创建时间,ISO 8601 格式。如果文件已被删除,则不返回该字段 | String |
modificationTime | 文件最近一次被覆盖的时间,ISO 8601 格式。如果文件已被删除,则不返回该字段 | String |
favoriteTime | 文件或目录的收藏时间,ISO 8601 格式 | String |
fileType | 文件类型。如果为目录或文件已被删除,则不返回该字段 | String |
path | 文件目录路径,字符串数组格式。仅当请求参数 withPath 为 true 时返回该字段 | Array |
userId | 收藏人 ID | String |
eTag | 目录或文件的 ETag | String |
virusAuditStatus | 查毒状态,可选值:0-6 | Number |
labels | 文件标签数组 | Array |
category | 自定义文件分类,如 image、video、doc 等 | String |
contentType | 媒体类型(仅非目录或相簿返回) | String |
crc64 | 文件的 CRC64-ECMA182 校验值 | String |
previewByDoc | 是否可通过 WPS 预览(仅非目录或相簿返回) | Boolean |
previewByCI | 是否可通过万象预览(仅非目录或相簿返回) | Boolean |
previewAsIcon | 是否可用预览图作为 icon(仅非目录或相簿返回) | Boolean |
removedByQuota | 是否因为配额超限而被删除文件(仅非目录或相簿返回) | Boolean |
metaData | 元数据(仅非目录或相簿返回) | Object |
取消收藏
注意:
若您使用收藏管理功能,需要具有相应空间的读写权限,且初始化创建 access_token 时必须要传 userId,否则会没有权限。
功能说明
deleteFavorite 实现取消收藏指定空间的文件或目录。支持通过文件路径或文件 ID(inode)进行取消收藏操作。使用示例
// 通过路径取消收藏const res = await smh.favorite.deleteFavorite({spaceId: 'your-space-id',cancel: 1,deleteFavoriteRequest: {path: '/documents/report.docx'}});// 通过 inode 取消收藏const res2 = await smh.favorite.deleteFavorite({spaceId: 'your-space-id',cancel: 1,deleteFavoriteRequest: {inode: '46bb40dd044f66340006425bd913af6f'}});
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID,如果媒体库为单租户模式,则该参数固定为连字符(-);如果媒体库为多租户模式,则必须指定该参数 | String | 是 |
cancel | 取消收藏标志,固定传递 1 表示执行取消收藏操作 | Number | 是 |
deleteFavoriteRequest | 取消收藏请求对象 | Object | 是 |
deleteFavoriteRequest 对象说明
字段 | 参数描述 | 类型 | 是否必填 |
path | 文件或目录的路径 | String | 否 |
inode | 文件或目录的 ID | String | 否 |
注意:
path 和 inode 二选一,至少提供一个;如果同时提供,以 inode 为准。
返回值说明
HTTP 状态码:204
取消收藏成功,无响应体。
增量同步
获取增量游标
getDeltaCursor 获取当前最新的增量游标(cursor),标记变更日志的最新位置。典型使用流程:
1. 先调用本接口获取当前最新的 cursor
2. 调用列出目录或文件接口全量拉取空间文件列表
3. 使用步骤 1 的 cursor 调用 queryDeltaLog 补齐全量拉取期间的变更
4. 后续定期使用保存的 cursor 调用 queryDeltaLog 进行增量同步
说明:
cursor 是一个不透明的字符串标记,调用方应将其作为黑盒保存和传递,无需解析其内容。
const res = await smh.file.getDeltaCursor({spaceId: 'your-space-id',});if (res.status === 200) {console.log('当前最新增量游标:', res.data.cursor);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
userId | 用户身份识别 | String | 否 |
返回值:HTTP 200,返回 cursor。
查询增量变动日志
queryDeltaLog 根据 cursor 拉取文件系统的增量变更日志列表,返回 cursor 之后发生的所有文件/目录变动事件。let cursor = savedCursor;do {const res = await smh.file.queryDeltaLog({spaceId: 'your-space-id',cursor,limit: 100,});if (res.status === 200) {const { contents, cursor: nextCursor, hasMore } = res.data;contents.forEach(item => {console.log(item.eventType, item.name, item.inode);});cursor = nextCursor;if (!hasMore) break;} else {break;}} while (true);
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
cursor | 增量游标 | String | 是 |
limit | 分页项目数,默认 100,最大 1000 | Number | 否 |
userId | 用户身份识别 | String | 否 |
常用事件类型
事件类型 | 说明 |
FILE.CREATE | 文件/目录/软链接创建 |
FILE.MODIFY | 文件内容修改 |
FILE.DELETE | 文件彻底删除 |
FILE.COPY | 文件/目录复制 |
FILE.MOVE | 文件/目录移动(含重命名) |
FILE.TRASH | 文件/目录放入回收站 |
FILE.RESTORE | 文件/目录从回收站恢复 |
FILE.CREATE_OVERWRITE | 创建文件时覆盖已有文件 |
FILE.MOVE_OVERWRITE | 移动文件时覆盖已有文件 |
HISTORY.CREATE | 历史版本创建 |
HISTORY.DELETE | 历史版本删除 |
HISTORY.LATEST | 设为最新版本(回滚) |
注意:
cursor 的最大有效期为 180 天,使用过期 cursor 时服务端返回 CursorExpired 错误,此时应重新获取 cursor 并进行全量同步。
高级功能
解压预览
previewZipFile 在不解压文件的情况下预览压缩包内容,支持 zip、tar、gz、7zip、rar 格式。注意:
此功能需在媒体库(library)级别开启
enableFileUncompress 功能后方可使用,未开启时返回 403(FileUncompressNotEnabled)。// 扁平列表格式预览const res = await smh.file.previewZipFile({spaceId: 'your-space-id',filePath: '/archive.zip',zipPreview: 1,format: 'flat',});if (res.status === 200) {console.log('文件数量:', res.data.fileNumber);console.log('是否被截断:', res.data.isTruncated);console.log('文件列表:', res.data.contents);}// 树形结构格式预览const res2 = await smh.file.previewZipFile({spaceId: 'your-space-id',filePath: '/archive.zip',zipPreview: 1,format: 'tree',});
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
zipPreview | 解压预览标识,固定值为 1 | Number | 是 |
format | 返回格式:flat(扁平列表,默认)、tree(树形结构) | String | 否 |
password | 加密压缩包密码 | String | 否 |
使用限制:
大小限制:tar/gz/rar 需小于 128MB,zip/7zip 无大小限制。
文件数限制:最多 1000 个,超出部分截断(isTruncated 为 true)。
需要在 library 级别开启 enableFileUncompress 功能。
文件解压
uncompressFile 将压缩包中的文件解压到指定目录,无需下载到本地。解压为异步任务,提交后通过任务查询接口轮询进度。注意:
此功能需在媒体库(library)级别开启
enableFileUncompress 功能后方可使用,未开启时返回 403(FileUncompressNotEnabled)。// 整包解压const res = await smh.file.uncompressFile({spaceId: 'your-space-id',filePath: '/archive.zip',uncompress: 1,uncompressFileRequest: {targetPath: '/extracted/',},});if (res.status === 202) {console.log('解压任务已提交,taskId:', res.data.taskId);}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 压缩包文件路径 | String | 是 |
uncompress | 解压标识,固定值为 1 | Number | 是 |
conflictResolutionStrategy | 冲突处理方式 | String | 否 |
uncompressFileRequest.targetPath | 解压目标目录路径(必须已存在) | String | 是 |
uncompressFileRequest.targetSpaceId | 目标空间 ID(支持跨空间解压,需 admin 权限) | String | 否 |
uncompressFileRequest.selectedFilePaths | 指定需解压的文件/文件夹路径列表 | Array | 否 |
uncompressFileRequest.password | 加密压缩包密码 | String | 否 |
返回值:HTTP 202,返回 taskId。
使用限制:
支持格式:zip、tar、gz、7zip、rar、apk
需要在 library 级别开启 enableFileUncompress 功能
支持跨空间解压(需 admin 权限)
支持加密压缩包解压
在线文档编辑
officeEdit 用于打开在线文档编辑入口,支持 Word、Excel、PPT、PDF 系列格式,文件大小不超过 200MB。该接口直接返回编辑器 HTML 页面字符串(非 JSON),可嵌入 iframe 或跳转访问。注意:
使用本功能前,需先在媒体库级别开启文档编辑能力,否则返回 DocEditNotEnabled 错误。
文件类型不支持时返回 FileTypeNotSupported 错误,文件超过 200MB 时返回 FileSizeExceeded 错误。
使用示例
const res = await smh.file.officeEdit({spaceId: 'your-space-id',filePath: '/documents/report.docx',lang: 'zh_CN',});// res.data 为编辑器 HTML 页面字符串,不是 JSONconsole.log('Editor HTML length:', res.data.length);
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 待编辑文档的路径 | String | 是 |
lang | 编辑器语言,如 zh_CN、en | String | 否 |
userId | 用户身份识别 | String | 否 |
下载文件(底层接口)
downloadFile 用于下载文件。服务端通过 HTTP 302 重定向到真实下载地址,无 JSON 响应体。日常下载建议使用「上传与下载」文档中的高层封装 downloadByUrl(浏览器原生下载,不占内存)或 createDownloadTask(支持分片并发、进度回调和完整性校验),或先通过 infoFile 获取带签名的下载链接(cosUrl)后自行处理。使用示例
const res = await smh.file.downloadFile({spaceId: 'your-space-id',filePath: '/documents/report.pdf',purpose: 'download',});// 302 跳转由 HTTP 层处理,无 JSON 响应体console.log('Status:', res.status);
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
spaceId | 空间 ID | String | 是 |
filePath | 文件路径 | String | 是 |
historyId | 历史版本 ID,不传默认为最新版 | String | 否 |
contentDisposition | 响应头 Content-Disposition,支持 inline(默认)或 attachment | String | 否 |
purpose | 用途,download 或 preview;preview 会将文件加入最近使用列表 | String | 否 |
trafficLimit | 单链接下载限速,范围 100KB/s-100MB/s,单位 B | Number | 否 |
internalDomain | 是否使用内网域名,0 或 1,默认 0 | Number | 否 |
userId | 用户身份识别 | String | 否 |
底层上传接口编排说明
上传与下载 文档中的高层封装
createUploadTask 已自动完成上传全流程编排(含秒传、分片、续期、确认),业务应优先使用。如需自行控制上传过程(如对接自有上传通道),可按以下顺序编排底层上传接口:1. 开始上传(三选一):
simpleUploadFile(简单上传,PUT + 文件内容一次上传)、formUploadFile(表单上传,POST 返回表单字段后向 COS 发起 multipart/form-data 上传,文件字段名固定 file 且须为最后一项)、multipartUploadFile(分块上传,POST + multipart=1,返回 uploadId 后按 https://{Domain}{Path}?uploadId={UploadId}&partNumber={N} 逐块上传,无需回传 ETag)。三个接口仅向 SMH 申请上传参数,文件字节流由客户端直传 COS;请求体携带 beginningHash/fullHash/size 可触发秒传(200 即完成,201 需继续上传)。2. 查询上传任务状态:
getFileUpload(GET + upload=1 + confirmKey),可查询已上传分块信息,用于断点续传。3. 分块任务续期:
renewMultipartUpload(POST + renew=1 + confirmKey),上传参数过期(expiration)前续期,仅支持分块任务。4. 完成上传:
completeFileUpload(POST + confirm=1 + confirmKey),建议携带 crc64 校验值。上传完成后必须调用本接口,否则文件无法正确存储。5. 取消上传:
abortFileUpload(DELETE + upload=1 + confirmKey),分块任务会同时放弃 COS 分块上传任务。