如何通过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
相关产品推荐
相关产品推荐

