ReboFiles文档
开始3
什么是 ReboFiles
快速开始
可运行的演示
集成到你的应用6
React 组件
Headless:你自己的界面
不使用框架
样式与主题
键盘与无障碍
语言
文件9
上传
预览与查看器
搜索
实时更改与大文件夹
评论
星标与字段
版本、回收站与空间
打包下载 .zip
Word 文档
服务器14
路由
框架与登录
谁可以做什么
存储:S3、GCS、Azure 与磁盘
检查上传
元数据:SQLite 与 Postgres
数据库结构
共享与链接
动态与通知
钩子、日志与限制
保留、法律保留与导出
桌面端与其他来源
同步文件夹
上线生产环境
协作1
AI 助手(MCP)
参考5
包
组件与 hooks
客户端 API
HTTP 路由
状态与路线图
↑↓ 移动↵ 打开Esc 关闭38 个页面

服务器 检查上传

检查上传

字节从浏览器直接传到存储桶,不经过服务器;服务器只在字节到达后才列出文件。因此有两个时机可以拒绝:分配地址之前(beforeUpload),以及字节到达后、任何人看到之前(inspect)。在第二个时机被拒绝的内容会从存储桶中删除。
beforeUpload

上传之前

依据页面提供的信息:名称、类型、大小和目标位置。此时还未发送任何内容。

import { Refused, createDriveHandler } from '@rebofiles/server';

createDriveHandler({
  // …
  beforeUpload: (upload) => {
    if (upload.type.startsWith('video/')) throw new Refused(415, 'no-videos', 'Videos go to the media library.');
    if (upload.parent === null && upload.purpose === 'file') return false; // nothing loose at the top
  },
});

Refused 会以其状态码、代码和消息返回;false 返回 403。每个新文件和新版本都会调用,页面生成的缩略图不会。类型和大小是页面声称的值:要检查真实内容,请用 inspect。

inspect

字节到达之后

在保存文件或版本之前调用,可读取存储中的字节。服务器的两种存储都支持读取。

import { checkType, clamav, createDriveHandler, inspectAll } from '@rebofiles/server';

createDriveHandler({
  // …
  // A program called photo.png, a PDF called .docx: refused. Then ClamAV, on its TCP socket.
  inspect: inspectAll(checkType(), clamav({ host: '127.0.0.1', port: 3310 })),
});
  • checkType() 读取前 4 KB。默认拒绝程序(.exe、Linux 或 Mac 的二进制文件),除非设置 programs: true;也拒绝字节与扩展名不符的文件,例如不是 PNG 的 PNG、不是 zip 的 .docx。only 可限定允许的类型。
  • clamav() 通过 INSTREAM 命令把字节发送给 clamd,每次一兆字节。超过 clamd 可接收大小(默认 25 MB)的文件会被拒绝,而不是未经扫描就放行。
  • inspectAll(…) 按顺序调用多个检查:第一个拒绝即拒绝。

未经检查的文件不会被放行。 当 inspect 抛出的不是 Refused(clamd 停止、超时)时,上传以 503 被拒绝,字节被删除。页面会提示,用户可以重新上传。

病毒

服务器上的 ClamAV

# Ubuntu: the daemon, its signatures kept fresh, and a socket the server reaches
sudo apt install clamav-daemon
echo 'TCPSocket 3310' | sudo tee -a /etc/clamav/clamd.conf
echo 'TCPAddr 127.0.0.1' | sudo tee -a /etc/clamav/clamd.conf
sudo systemctl restart clamav-daemon

# Or in Docker
docker run -d -p 3310:3310 clamav/clamav
自定义

自定义 inspect

任意函数:服务商的扫描器,或你自己关于可保存内容的规则。

inspect: async (upload, drive) => {
  if (upload.purpose === 'rendition') return;     // a smaller picture the page made
  const head = await upload.read({ from: 0, to: 4100 });
  const verdict = await myScanner(upload.key, head);
  if (verdict === 'reject') throw new Refused(422, 'rejected', `${upload.name} was not kept.`);
},
错误

用户看到的内容

代码状态何时
upload-refused403beforeUpload 返回 false
program-refused422checkType:是程序
type-mismatch422checkType:字节与扩展名不符
type-refused422checkType:类型不在 only 中
virus-found422clamav:发现病毒,消息中给出名称
refused-content422inspect 返回 false
not-scanned · not-inspected503clamav 或 inspect 无法检查

网盘会根据代码,用每个人的语言显示。