You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Delphi Mormot服务器向认证客户端流式传输大备份文件?

实现Mormot服务器流式传输ZIP文件到客户端

完全可以实现,不需要暴露服务器的C:\temp文件夹,利用Mormot的自定义服务接口+流式响应就能搞定,以下是具体实现步骤:

1. 服务器端添加带认证的下载接口

首先定义一个继承自Mormot可调用接口的服务,依托你已有的认证机制,确保只有授权用户能访问该接口:

type
  IBackupService = interface(IInvokable)
  ['{YOUR-GUID-HERE}']
    // 返回备份文件的流对象,Mormot会自动处理流式传输
    function DownloadBackup: TStream;
  end;

  TBackupService = class(TInterfacedObject, IBackupService)
  public
    function DownloadBackup: TStream;
  end;

function TBackupService.DownloadBackup: TStream;
var
  FilePath: string;
  HttpCtx: THttpServerRequest;
begin
  FilePath := 'C:\temp\backup.zip';
  
  // 校验文件是否存在
  if not FileExists(FilePath) then
    raise Exception.Create('备份文件不存在');

  // 获取当前HTTP上下文,设置下载响应头
  HttpCtx := THttpServerRequest.Current;
  if Assigned(HttpCtx) then
  begin
    HttpCtx.Response.ContentType := 'application/zip';
    // 指定客户端下载时的文件名
    HttpCtx.Response.SetCustomHeader('Content-Disposition', 
      'attachment; filename="backup.zip"');
    // 可选:设置文件大小,帮助浏览器显示下载进度
    HttpCtx.Response.ContentLength := FileSizeByName(FilePath);
  end;

  // 返回文件流,Mormot会自动完成流式发送
  Result := TFileStream.Create(FilePath, fmOpenRead or fmShareDenyWrite);
end;

然后在服务器启动时注册这个服务:

Server.ServiceDefine(TBackupService, IBackupService, sicShared);

2. 前端页面触发下载

在你的Moustache渲染页面中,添加触发按钮,通过直接跳转接口或AJAX方式发起请求(因为已有认证,请求会自动携带认证凭证):

<button onclick="startBackupDownload()">下载备份文件</button>

<script>
function startBackupDownload() {
  // 最简单的方式:直接跳转到接口地址,浏览器自动处理下载
  window.location.href = '/root/BackupService/DownloadBackup';

  // 若需要自定义下载逻辑(比如显示进度),可使用AJAX+Blob方式:
  /*
  fetch('/root/BackupService/DownloadBackup', {
    method: 'GET',
    credentials: 'include' // 携带认证Cookie
  })
  .then(res => {
    if (!res.ok) throw new Error('下载请求失败');
    return res.blob();
  })
  .then(blob => {
    const downloadUrl = window.URL.createObjectURL(blob);
    const aTag = document.createElement('a');
    aTag.href = downloadUrl;
    aTag.download = 'backup.zip'; // 指定客户端保存的文件名
    document.body.appendChild(aTag);
    aTag.click();
    window.URL.revokeObjectURL(downloadUrl);
    document.body.removeChild(aTag);
  })
  .catch(err => alert(err.message));
  */
}
</script>

核心优势说明

  • 无需暴露服务器C:\temp目录:所有文件传输都通过认证后的接口完成,Mormot直接读取文件流并发送给客户端,不会泄露服务器本地路径。
  • 流式传输原生支持:返回TStream类型结果时,Mormot底层会自动分块发送数据,适合大体积备份文件的传输。
  • 复用现有认证体系:接口会继承服务器的认证配置,只有已通过认证的用户才能调用下载方法。

内容的提问来源于stack exchange,提问作者Shane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:45:36