Delphi 10.4 借助PPK搭建SFTP客户端及原生组件实现上传方案问询
Delphi SFTP连接相关问题解答
原生支持情况说明
Delphi全版本均未内置原生SFTP连接组件,即使是高价的商业授权版本,标准组件库也未包含对SFTP协议的官方支持,这是目前的客观现状。
自带组件实现方案
无需购买第三方付费组件,通过Delphi自带组件即可实现SFTP文件上传,常用实现路径如下:
- 调用系统原生
sftp命令行工具实现:Windows 10 1809及以上版本、所有主流Linux、macOS均默认预装sftp命令行客户端,你可以通过Delphi自带的TProcess组件调用该命令,通过构造执行参数、重定向输入输出流的方式完成身份认证、文件上传全流程。简单实现参考代码如下:
uses Process, SysUtils; procedure UploadSFTPFile(const LocalFilePath, RemoteTargetDir, SFTPHost, SFTPUsername, SFTPPassword: string); var SFTPProcess: TProcess; begin SFTPProcess := TProcess.Create(nil); try SFTPProcess.Executable := 'sftp'; // 配置非批量模式、从标准输入读取指令 SFTPProcess.Parameters.AddStrings(['-o', 'BatchMode=no', '-b', '-']); SFTPProcess.Parameters.Add(Format('%s@%s', [SFTPUsername, SFTPHost])); SFTPProcess.Options := [poUsePipes, poNoConsole, poWaitOnExit]; SFTPProcess.Execute; // 写入密码、上传指令、退出指令到进程输入流 SFTPProcess.Input.WriteBuffer(Pointer(SFTPPassword + #10)^, Length(SFTPPassword) + 1); SFTPProcess.Input.WriteBuffer(Pointer(Format('put "%s" "%s"%s', [LocalFilePath, RemoteTargetDir, #10]))^, Length(Format('put "%s" "%s"%s', [LocalFilePath, RemoteTargetDir, #10]))); SFTPProcess.Input.WriteBuffer(Pointer('exit'#10)^, 5); finally SFTPProcess.Free; end; end;
该方案开发成本极低,适合简单的单文件/批量文件上传场景,使用时注意自行补充进程退出码校验、异常捕获逻辑即可。
- 基于自带Indy组件+OpenSSL封装自定义实现:Delphi标准组件库自带Indy网络组件集,同时内置OpenSSL接口绑定,你可以基于Indy的TCP通信能力加OpenSSL的加密支持,自行实现SFTP协议的交互逻辑,该方案开发成本较高,适合有复杂SFTP操作需求的场景。
内容的提问来源于stack exchange,提问作者fisi-pjm
相关产品推荐
相关产品推荐

