在员工离职或出于其它安全考虑,企业需要对员工创建或管理的文件进行管控,或对扫描出敏感信息的文件进行管控,限制文件下载。
如何限制企业用户下载特定文件
本定制方案仅适用于私有化WPS365版本
1. 方案概述
员工离职前,出于安全考虑,企业会对其创建或管理的文件进行管控。
管控会有两个实现方式:
- 给文档加水印
- 禁止员工下载
有安全管控需求时,比如文件扫描出敏感信息,用户的网络环境(内网或外网)、文件大小不满足管理规定,都有可能需要限制下载。
针对这两种情况,我们可以使用文档中心Web端(PC端)的开放能力,定制下载功能:
| 实现效果 | 对文档进行管控后,员工下载文件时,会对文件进行处理,比如加水印; 也会限制下载,比如员工点击下载按钮,会出现下载失败的提示。![]() |
| 支持端 | 文档中心PC端 |
| 版本限制 | 版本23-11a(含)以上 |
| 操作系统限制 | 支持X86、XC |
2. 使用指南
单文件下载判断拦截
👉能力
dc_file.PreCheckGetFileDownloadUrl
👉方法
PostGetFileDownloadUrl:单文件下载时获取文件下载 Url 进行定制
| 策略 | 触发接口 |
|---|---|
| dc_file.PreCheckGetFileDownloadUrl | /file/u/v1/drives/{drive_id}/files/{file_id}/download |
👉可检查的字段
| 名称 | 类型 | 是否可以修改 | 描述 | 版本号 |
|---|---|---|---|---|
| AccountId | string | 否 | 账户Id | 23-11a |
| CompanyId | string | 否 | 企业Id | 23-11a |
| DriveId | string | 否 | 文件存放的盘Id | 23-11a |
| FileId | string | 否 | 文件Id | 23-11a |
可以根据文件 ID调用 GetFileInfo 获取文件详细信息与路径
👉代码示例
// 单文件下载预检查
async function PreCheckGetFileDownloadUrl(
ctx: service.PreCheckGetFileDownloadUrlContext
) {
const input = ctx.ContextValue()
// 根据文件id获取文件详细信息
const fileInfo = componentInst.dc_drive.MAIN.GetFileInfo(
ctx.GoContext(),
input.DriveId,
input.FileId
)
// 根据文件id获取文件路径
const filePath = componentInst.dc_drive.MAIN.GetFilePath(
ctx.GoContext(),
input.DriveId,
input.FileId
)
// TODO: 根据文件详情自定义限制条件,比如: 文件大小限制
const ext = fileExt(fileInfo.Name)
// 文件名包含“test_”则返回错误
if (fileInfo.Name.includes('test_'))
throw new JSBizError(400, 'test_ 文件被限制')
return
}
👉效果截图

单文件下载时获取文件下载URL进行定制
👉能力
dc_file.PostGetFileDownloadUrl
👉方法
PostGetFileDownloadUrl:单文件下载时获取文件下载 Url 进行定制
| 策略 | 触发接口 |
|---|---|
| dc_file.PostGetFileDownloadUrl | /file/u/v1/drives/{drive_id}/files/{file_id}/download |
👉可检查的字段
| 名称 | 类型 | 是否可以修改 | 描述 | 版本号 |
|---|---|---|---|---|
| FileId | string | 否 | 文件Id | 23-11a |
| DriveId | string | 否 | 文件存放的盘Id | 23-11a |
| Url | string | 是 | 文件下载路径 | 23-11a |
文件下载路径可以通过埋点修改
返回值:
| 名称 | 类型 | 描述 | 版本号 |
|---|---|---|---|
| Url | string | 文件下载路径 | 23-11a |
文件下载路径可以通过埋点修改
👉代码示例
修改返回的 url
可以导入添加水印、导出为PDF等第三方接口,对文件进行定制
// 单文件下载 url
async function PostGetFileDownloadUrl(
ctx: service.PostGetFileDownloadUrlContext
) {
const input = ctx.ContextValue()
const output = ctx.Result()
const fileInfo = componentInst.dc_drive.MAIN.GetFileInfo(
ctx.GoContext(),
input.DriveId,
input.FileId
)
// 文件后缀为demo,则下载为自定义地址
const ext = fileExt(fileInfo.Name)
if (ext === 'demo') {
// 修改返回路径
output.Url = 'http://demo_url/' + fileInfo.Id
return
}
return
}
👉效果截图

批量文件下载之前进行检查时对文件进行定制
👉能力
dc_file.PreCheckPostBatchDownloadFile
👉方法
PreCheckPostBatchDownloadFile:批量文件下载之前进行检查时对文件进行定制
| 策略 | 触发接口 |
| dc_file.PreCheckPostBatchDownloadFile | /file/u/v1/drives/{drive_id}/files/batch_download/check |
👉可检查字段
| 名称 | 类型 | 是否可以修改 | 描述 | 版本号 |
| AccountId | string | 否 | 账户Id | 23-11a |
| CompanyId | string | 否 | 企业Id | 23-11a |
| FileIds | string[] | 否 | 批量下载的文件Id列表 | 23-11a |
| DriveId | string | 否 | 文件存放的盘Id | 23-11a |
| WpsSid | string | 否 | 用来做url鉴权 | 23-11a |
| WithChecksum | boolean | 否 | 是否校验文件一致性 | 23-11a |
| MaxSize | number | 否 | 系统后台读取到的文件最大下载数量 | 23-11a |
| MaxNum | number | 否 | 系统后台读取到的文件最大下载大小 | 23-11a |
根据文件id 调用 GetFileInfo 可以获取文件具体信息
返回值: 无
👉代码示例
示例: 根据批量下载的文件夹列表获取文件下载路径
// 批量下载预检查
asyncfunctionPreCheckPostBatchDownloadFile(ctx: service.PreCheckPostBatchDownloadFileContext) {
const input = ctx.ContextValue()
// TODO: 自定义限制条件,比如:数量限制、大小限制等 // 根据 FileId 等获取文件详情
const fileInfo = componentInst.dc_drive.MAIN.GetFileInfo(ctx.GoContext(), input.DriveId, input.FileIds[0])
log.Debug("--DEUBG: dc_file: PreCheckPostBatchDownloadFile: componentInst._drive._main_inst.GetFileInfo: ", JSON.stringify(fileInfo))
// 通过 Type 区分文件与文件夹 file 文件、folder为文件夹
if (fileInfo.Type == "folder") {
const req: ListFileInFolderByOffsetReq = {
DriveId: input.DriveId,
Limit: 1000,
Offset: 0,
ParentId: fileInfo.ParentId
}
// 获取文件夹下的文件
const childrenFile = componentInst.dc_drive.MAIN.ListFileInFolderByOffset(ctx.GoContext(), req)
} else {
// 如果不是文件夹,根据 FileId 等获取文件下载url
const res = componentInst.dc_file.MAIN.CheckPermToFileDownload(ctx.GoContext(), input.CompanyId, input.AccountId, input.FileIds[0], input.DriveId, input.WpsSid, input.WithChecksum)
}
return
}
👉效果截图

批量文件下载时对文件进行前置检查定制
👉能力
dc_file.PreBatchDownloadFile
| 策略 | 触发接口 |
| dc_file.PreBatchDownloadFile | /file/u/v1/drives/{drive_id}/files/batch_download |
PreBatchDownloadFile:批量文件下载时对文件进行前置检查定制
👉可检查的字段
| 名称 | 类型 | 是否可以修改 | 描述 | 版本号 |
| AccountId | string | 否 | 账户Id | 23-11a |
| CompanyId | string | 否 | 企业Id | 23-11a |
| FileIds | string[] | 否 | 批量下载的文件Id列表 | 23-11a |
| DriveId | string | 否 | 文件存放的盘Id | 23-11a |
| WpsSid | string | 否 | 用来做url鉴权 | 23-11a |
| WithChecksum | boolean | 否 | 是否校验文件一致性 | 23-11a |
根据文件 id 调用 GetFileInfo 可以获取文件具体信息
**返回值:**无
👉代码示例
asyncfunctionPreBatchDownloadFile(ctx: service.PreBatchDownloadFileContext) {
const input = ctx.ContextValue()
// TODO: 自定义限制条件,比如:数量限制、大小限制等 return
}
单文件历史版本下载时对文件进行前置检查定制
👉能力
dc_file.PreCheckGetVersionDownloadUrl
PreCheckGetVersionDownloadUrl:单文件历史版本下载时对文件进行前置检查定制
👉可检查的字段
| 名称 | 类型 | 是否可以修改 | 描述 | 版本号 |
| AccountId | string | 否 | 账户Id | 23-11a |
| CompanyId | string | 否 | 企业Id | 23-11a |
| DriveId | string | 否 | 文件存放的盘Id | 23-11a |
| FileId | string | 否 | 文件Id | 23-11a |
| Version | number | 否 | 文件历史历史版本 | 23-11a |
**返回值:**无
👉代码示例
// 历史版本下载asyncfunctionPreCheckGetVersionDownloadUrl(ctx: service.PreCheckGetVersionDownloadUrlContext) {
const input = ctx.ContextValue()
// TODO: 自定义限制条件return
}
单文件历史版本下载时获取Url进行定制
👉能力
dc_file.PostGetVersionDownloadUrl
PostGetVersionDownloadUrl:单文件历史版本下载时获取Url进行定制
👉可检查的字段
| 名称 | 类型 | 是否可以修改 | 描述 | 版本号 |
| FileId | string | 否 | 文件Id | 23-11a |
| DriveId | string | 否 | 文件存放的盘Id | 23-11a |
| Url | string | 是 | 文件下载路径 | 23-11a |
文件下载路径可以通过埋点修改
返回值:
| 名称 | 类型 | 描述 | 版本号 |
| Url | string | 文件下载路径 | 23-11a |
👉代码示例
修改 url 路径
input、ouptut 均属于可以检查字段
asyncfunctionPostGetVersionDownloadUrl(ctx: service.PostGetVersionDownloadUrlContext) {
const input = ctx.ContextValue()
const output = ctx.Result()
// 修改返回 url
output.Url = "your url"return
}
批量下载修改下载url接口
👉能力
dc_file.PostBatchDownloadUrl
批量下载修改下载url接口,该埋点是被服务端循环调用,针对批量下载的文件循环遍历,调用埋点逻辑
返回值:
| 名称 | 类型 | 描述 | 版本号 |
| DownloadUrl | string | 文件下载路径,即是入参也是返回结果 | 23-11a |
👉代码示例
修改 文件下载地址
asyncfunctionPostBatchDownloadUrl(ctx: service.PostBatchDownloadUrlContext) {
// TODOif (ctx.Result().DownloadUrl === "http://fdsaf"){
ctx.Result().DownloadUrl="新地址"
}
}
