File Manager

TsgcHTMLComponent_FileManager:面向 Web 门户的服务器端渲染文件管理器。用户浏览文件夹、预览、上传、下载和整理文件,服务器在接触存储之前,会根据权限、文件规则和您自己的角色检查来验证每个请求。适用于 Delphi、C++ Builder 和 .NET。

TsgcHTMLComponent_FileManager

设置 RootFolder 或分配一个 Provider,在 Permissions 中授予操作权限,然后渲染。每次点击都会提交一个无状态的服务器事件,每个下载或预览都是带签名的链接,OnBeforeOperation 仍可拒绝单个操作。

组件类

TsgcHTMLComponent_FileManager,其所操作的存储使用 TsgcHTMLFileManagerProvider

渲染为

工具栏、文件夹树、面包屑、详细信息或缩略图列表、带预览的详细信息窗格、状态栏、右键菜单和上传面板,使用 Bootstrap 5 并内嵌 Bootstrap Icons,无需 CDN

语言

Delphi, C++ Builder, .NET

指向一个文件夹,授予操作权限,检查角色

Permissions 默认只允许下载,因此请授予您的用户可以执行的操作。OnBeforeOperation 在内置检查之后、存储之前运行,带有请求的操作、路径和会话。

uses
  sgcHTML_Component_FileManager;

// 只创建一次:它自行响应服务器事件和文件链接
oFM := TsgcHTMLComponent_FileManager.Create(Self);
oFM.Name := 'fmDocs';
oFM.RootFolder := 'C:\Portal\Documents';
oFM.RootCaption := 'Documents';
oFM.Permissions := [fmpCreateFolder, fmpUpload, fmpDownload, fmpRename,
  fmpMove, fmpCopy];
oFM.AllowedExtensions := '.pdf;.docx;.xlsx;.png;.jpg;.txt';
oFM.MaxFileSize := 20 * 1024 * 1024;
oFM.HTMXEngine := HTMXEngine1;
oFM.OnBeforeOperation := FileManagerBeforeOperation;
Result := oFM.HTML;

// 按用户设置角色:匿名时 aArgs.Session 为 nil
procedure TForm1.FileManagerBeforeOperation(Sender: TObject;
  const aOperation: TsgcHTMLFileManagerOperation;
  const aArgs: TsgcHTMLFileManagerOperationArgs; var aAccept: Boolean;
  var aErrorMessage: string);
begin
  // 查看者和匿名用户只能读取
  if (aArgs.Session = nil) or not (aArgs.Session.HasRole('admin') or
    aArgs.Session.HasRole('editor')) then
    aAccept := aOperation in [fmoList, fmoSearch, fmoDownload, fmoPreview]
  // 编辑者不能删除
  else if not aArgs.Session.HasRole('admin') then
    aAccept := aOperation <> fmoDelete;
  if not aAccept then
    aErrorMessage := 'Your role does not allow this operation.';
end;
@* Pages/Documents.cshtml:每个引擎和名称对应一个文件管理器 *@
@model DocumentsModel

<sgc-file-manager name="fmDocs" root-folder="C:\Portal\Documents" root-caption="Documents"
                  permissions="createfolder,upload,download,rename,move,copy"
                  allowed-extensions=".pdf;.docx;.xlsx;.png;.jpg;.txt" max-file-size="20971520"
                  live-sync="true" on-get-permissions="Model.GetPermissions"
                  on-before-operation="Model.CheckAccess" on-after-operation="Model.Audit" />
using esegece.sgcWebSockets;

var fm = new TsgcHTMLComponent_FileManager();
fm.Name = "fmDocs";
fm.RootFolder = @"C:\Portal\Documents";
fm.RootCaption = "Documents";
fm.Permissions = TsgcHTMLFileManagerPermissions.fmpCreateFolder |
    TsgcHTMLFileManagerPermissions.fmpUpload | TsgcHTMLFileManagerPermissions.fmpDownload |
    TsgcHTMLFileManagerPermissions.fmpRename | TsgcHTMLFileManagerPermissions.fmpMove |
    TsgcHTMLFileManagerPermissions.fmpCopy;
fm.AllowedExtensions = ".pdf;.docx;.xlsx;.png;.jpg;.txt";
fm.MaxFileSize = 20L * 1024 * 1024;
fm.HTMXEngine = htmxEngine;
fm.OnGetPermissions += GetPermissions;
string html = fm.HTML;

// 每个用户获得其角色的权限
public void GetPermissions(object sender, TsgcHTMLFileManagerOperationArgs args,
    ref TsgcHTMLFileManagerPermissions permissions)
{
    if (args.Session != null && args.Session.Roles.Contains("admin"))
        permissions |= TsgcHTMLFileManagerPermissions.fmpDelete;
}

您的用户能得到什么

桌面上熟悉的文件管理器,现在在浏览器中使用,每个操作都由您的服务器检查。

两种视图和一棵文件夹树

详细信息视图带有可排序的列(名称、大小、修改时间、类型),缩略图视图带有图像预览。文件夹树按需加载,具有 TreeView 的键盘操作和角色,旁边是面包屑、视图切换、刷新和状态栏。

搜索

搜索框筛选当前文件夹,按 Enter 则在服务器上搜索子文件夹。匹配项连同文件夹列一起显示,最多 MaxSearchResults 项。

预览

详细信息窗格可预览图像、使用 PDFViewer 内嵌 pdf.js 的 PDF 文件以及文本文件,并显示项目的属性、“打开”或“下载”按钮,以及来自 OnItemDetails 的您自己的 HTML。

整理文件

新建文件夹、上传、下载、重命名、删除、剪切、复制和粘贴,每项仅在获得授权时可用。把项目拖到列表、树或面包屑中的文件夹上即可移动,按住 Ctrl 或 Alt 则复制,按住 Shift 可选择“移动到此处”或“复制到此处”。选中的多个文件会依次下载。

分块上传

采用 TsgcHTMLComponent_FileUpload 协议的分块、可续传上传:一个上传按钮、从桌面拖放到浮层上的文件,以及显示每个文件进度的上传面板。已存在的名称会变成 name (2).ext。

右键菜单

右键单击、Shift+F10 或菜单键会打开右键菜单,其中有相同的命令和您的 CustomCommands,后者可以限定于某些文件类型。

响应式且无障碍

在 768 像素以下,树会变成离屏面板,详细信息窗格移到列表下方。通过 Bootstrap 变量支持深色模式、从右到左的布局、ARIA 角色以及 polite 实时区域。

17 种语言

文件管理器的所有文本都来自库的区域设置 sgcHTMLDefaultLocale,共 17 种语言,失败的操作会显示其错误的本地化文本。

关键属性、方法与事件

您最常用到的成员。

权限和角色

Permissions 设置用户可以执行的操作,默认只有 fmpDownload。OnGetPermissions 为每个用户或每个请求提供其角色的权限,OnBeforeOperation 仍可拒绝单个操作,例如按文件夹拒绝。被拒绝的操作会在提示框中显示 aErrorMessage。

默认安全

每个请求都会在服务器上再次验证:路径、名称、Permissions、AllowedExtensions、MaxFileSize 和隐藏文件(ShowHiddenFiles)。格式错误的请求,例如未知的操作或超过 1000 个项目,会返回状态 400。

签名链接

下载、预览和缩略图是对 GetFileURL 用 HMAC-SHA256 签名的链接发出的 GET 请求,绑定到路径、会话和过期时间(TokenLifetime,默认 300 秒)。引擎从提供程序流式传输文件,绝不会把它整个加载到内存中。

共享链接

GetShareURL 写出一个不绑定会话的签名下载链接,因此没有账户的人也可以在链接过期之前下载文件。

任意存储

内置提供程序显示本地文件系统中的一个文件夹,即 RootFolder。数据库、云存储或压缩包则是分配给 Provider 的 TsgcHTMLFileManagerProvider 的后代类。提供程序收到的每个路径都是相对路径,以 / 分隔,且已经过验证。

自定义命令

CustomCommands 可以向工具栏、右键菜单或两者添加您自己的操作,例如签名、共享或转换,也可以只针对某些文件类型。OnCommand 负责响应它们。

审计和实时同步

OnAfterOperation 在每次成功的操作之后触发,可用于生成审计记录,OnError 在操作失败时触发。使用 LiveSync 时,显示某个文件夹的每个浏览器都会在其他用户更改它时自动刷新。

无状态的服务器事件

每个操作都会把服务器事件 fm 连同其 CSRF 头一起提交到 HTMX 引擎的组件事件端点,或提交到 ActionURL。组件在请求之间不保留任何状态:它验证请求,通过 Execute 运行,并以标有 hx-swap-oob="true" 的片段作答。

undefined

在 Razor 视图中,<sgc-file-manager name="..."> Tag Helper 渲染文件管理器。首次渲染会为每个引擎和名称创建一个组件,并注册到 AddSgcHtml 的引擎,每次渲染都会再次根据特性设置其属性。CustomCommands、TokenSecret 和 Provider 需要在代码中创建组件。

演示

Demos\60.HTML\01.RunTime\28.FileManager 是端口 8130 上的 sgc Document Portal。页眉中可切换三位用户:Alice(管理员)、Ben(编辑者)和 Carla(查看者),角色在 OnBeforeOperation 中应用。LiveSync、活动动态、在线头像和存储图表会随文件变化而更新,“签名”命令用 SignaturePad 为 PDF 签名,“共享链接”命令显示一个签名链接。设计时、Lazarus 和 .NET 版本与之对应。

继续探索

在线试用查看 文件管理器 演示,它在 eSeGeCe 演示服务器上实时运行。
在线帮助此组件的完整 API 参考和使用指南。
FileUpload 组件文件管理器所使用的分块、可续传上传协议。
PDFViewer 组件PDF 预览背后内嵌的 pdf.js 查看器。
所有 sgcHTML 组件浏览 80 多个组件的完整功能矩阵。
下载免费试用版30 天试用版包含 60.HTML 演示项目。
价格Single、Team 和 Site 授权,均含完整源代码。
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

准备好开始了吗?

下载免费试用版,开始在 Delphi、C++ Builder 和 .NET 中构建 Web 界面。