有些企业出于文档安全、带宽分配等原因,需要限制或全面杜绝文件上传。文档中心开放能力支持企业定制上传功能。
如何限制企业用户上传特定文件?
本定制方案仅适用于私有化WPS365版本
1. 方案概述
有些企业出于文档安全、带宽分配等原因,需要限制文件上传:
- 可能是“禁止某种格式的文件被上传文档中心”,因为有些格式可能夹带病毒。
- 可能是“禁止个人设备上传文件”,避免企业用户误把个人电脑、手机里的个人文件上传公司文档中心。
- 可能是不希望网络带宽被占用,需要设置“多少大小以上的文件禁止上传”……
有些企业希望完全杜绝以上风险,全面禁止企业用户上传文件。
针对这两种情况,我们可以使用文档中心服务端、Web端(PC端)、H5端(移动端)的开放能力,定制上传功能:
| 实现方式&效果 | 方案一需禁止特定文件类型 | 通过修改文件上传接口的策略并进行校验,可定制5种限制:文件格式、文件大小、上传文件的设备、上传文件的IP、文件名称。![]() 限制特定文件格式限制文件大小![]() 限制上传文件的设备、IP限制特定文件名称禁止上传 |
| 方案二需全面禁止上传 | 将文档中心Web端、H5端的的按钮完全隐藏、屏蔽,来达到禁止完全上传的效果。![]() 定制前,文件夹里有上传按钮定制后,上传按钮不可见 | |
| 涉及接口 | 文件请求上传文件提交上传 | |
| 依赖版本 | 方案一:版本23-10a(含)以上可支持方案二:版本24-02b(含)以上可支持 | |
| 依赖操作系统 | 皆支持X86、XC | |
2. 使用指南
👉文件上传前校验
使用服务端hook,修改文件上传相关接口的策略并进行校验。
📌 注意
存在多个接口可实现相同功能的情况,使用hook前需查看文档注意触发策略接口。
能力:
| 功能 | 埋点 | 触发策略接口 | 适用版本 |
| 文件上传时对文件名称进行前置检查 | dc_file.CheckFilenameBeforeRequestUploaddc_file_new.CheckFilenameBeforeRequestUpload | /file/u/v1/drives/{drive_id}/files/{parent_id}/request_upload 文件请求上传/file/u/v1/drives/{drive_id}/files/{parent_id}/commit_upload 文件提交上传/v7/drives/{drive_id}/files/{parent_id}/request_upload 文件请求上传/v7/drives/{drive_id}/files/{parent_id}/commit_upload 文件提交上传 | 23-10a |
| 文件上传时对文件进行前置检查定制 | dc_file.PreCheckBeforeRequestUploaddc_file_new.PreCheckBeforeRequestUpload | /file/u/v1/drives/{drive_id}/files/{parent_id}/request_upload 文件请求上传/file/u/v1/drives/{drive_id}/files/{parent_id}/commit_upload 文件提交上传/v7/drives/{drive_id}/files/{parent_id}/request_upload 文件请求上传/v7/drives/{drive_id}/files/{parent_id}/commit_upload 文件提交上传 | 23-10a |
| 获取设备信息 | componentInst.GetDevice | 23-10a |
PreCheckBeforeRequestUpload同样可以进行文件名称检测
使用方法:
async function PreCheckBeforeRequestUpload(ctx: service.PreCheckBeforeRequestUploadContext) {
// 获取设备信息
let device = componentInst.GetDevice(ctx.GoContext());
const IP = device.Device.IP;
const DeviceType = device.Device.DeviceType;
// 安卓端禁止上传
if (DeviceType === "Android") throw new JSBizError(400, "android not support upload");
// 限制IP
if (IP === "10.0.2.2") throw new JSBizError(400, "IP not support upload");
const input = ctx.ContextValue();
// 获取格式
const ext = fileExt(input.Filename);
// 限制格式
if (ext !== "txt") throw new JSBizError(400, "only txt file can be uploaded");
// 限制文件名称长度
if (input.Filename.length > 10) throw new JSBizError(400, "file name too long");
// 限制文件大小为20字节
if (input.FileSize > 20) throw new JSBizError(400, "file size too large");
}
// 检查上传文件名称
async function CheckFilenameBeforeRequestUpload(ctx: service.CheckFilenameBeforeRequestUploadContext) {
const input = ctx.Argument();
// 文件名称长度不能大于10个字符
if (input.FileName.length > 10) throw new JSBizError(400, "file name too long");
// NOTE: 如果不定制,使用 ctx.Next() 执行原有逻辑,防止返回零值导致云文档逻辑出错
ctx.Next()(ctx);
}
效果:
| 文件大小限制 | ![]() |
|---|---|
| 文件格式校验 | ![]() |
| IP/设备限制 | ![]() |
| 文件名称限制 | ![]() |
👉文件上传前端定制
上传前端定制主要包括下面几个方面
| 产品端 | 适用场景说明 |
| 上传按钮隐藏 | ![]() ![]() ![]() 文件列表右上方左侧导航栏团队无文档时空白位置右键 |
| 上传按钮拦截 | ![]() ![]() ![]() 文件列表右上方左侧导航栏团队无文档时空白位置右键 |
| 拖拽上传拦截 | ![]() |
上传按钮隐藏(团队无文档时)
能力:
| 功能 | 埋点 | 适用版本 |
|---|---|---|
| 挂载 | sdk.kdrive.fileList.empty.uploadButton.onAdded | 23-05b |
| 隐藏 | sdk.kdrive.fileList.empty.uploadButton.hide | 23-05b |
文件列表右上方、左侧导航栏、空白位置右键等可见文件操作项拦截文档,这里不再重复介绍
使用方法:
// 上传按钮加载后
sdk.kdrive.fileList.empty.uploadButton.onAdded(() => {
// 隐藏上传按钮
sdk.kdrive.fileList.empty.uploadButton.hide();
});
📌 注意
均为sdk的基本DOM处理能力
效果:

上传按钮拦截
能力:
- 统一点击拦截埋点:sdk.kdrive.uploadButton.onClick(202402B版本后)
| 功能 | 埋点 | 适用版本 | 是否支持多插件 | 是否支持异步 |
| 点击拦截 | sdk.kdrive.uploadButton.onClick | 24-02b | 是 | 是 |
使用方法:
sdk.kdrive.uploadButton.onClick((data) => {
// 使用data进行定制操作
console.log(data);
// true时拦截原本逻辑,false时会正常调用
return true;
});
效果:

拖拽上传拦截
能力:
| 功能 | 埋点 | 适用版本 | 是否支持多插件 | 是否支持异步 |
| 拖拽拦截 | sdk.kdrive.upload.onDragInterecpt | 23-08b | 是 | 是 |
使用方法:
sdk.kdrive.upload.onDragInterecpt((data)=>{
// 使用data进行定制操作
console.log(data)
// true时拦截原本逻辑,false时会正常调用
return true
})
效果:

