Go标准库不支持FTP,需用github.com/jlaffaye/ftp库实现上传下载;支持主动/被动模式(默认被动),兼容主流服务器,无需CGO,跨平台;注意防火墙对被动模式的影响。

Go 语言标准库不直接支持 FTP 协议,但可通过第三方库 github.com/jlaffaye/ftp 快速实现基础 FTP 客户端功能,完成文件上传与下载。该库轻量、稳定,兼容大多数 FTP 服务器(包括 vsftpd、FileZilla Server 等),且支持主动/被动模式(默认被动)。
安装依赖库
执行以下命令引入官方维护较活跃的 FTP 客户端库:
go get github.com/jlaffaye/ftp
注意:该库基于 Go 原生 net 包构建,无需 CGO,跨平台兼容性好。
建立连接并登录
使用 ftp.Dial 连接服务器,再调用 Connect 和 Login 完成认证。建议设置超时避免阻塞:
立即学习“go语言免费学习笔记(深入)”;
一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!
- 连接时传入
net.DialTimeout或使用ftp.Dial的带超时变体(如ftp.DialTimeout) - 匿名登录可传入
"anonymous", "";普通账号需提供用户名和密码 - 若服务器要求 TLS(FTPS),需改用
ftp.DialTLS并配置tls.Config
上传文件到服务器
调用 Upload 方法可将本地文件流式上传至远程路径。关键点:
- 本地文件需以只读方式打开,
Upload内部会处理读取和发送 - 远程路径为服务器上的完整路径(如
"/upload/test.txt"),目录需已存在 - 若需创建目录,先用
MakeDir,再ChangeDir切换工作路径 - 示例:
err := conn.Upload("local.txt", "/remote.txt")
从服务器下载文件
使用 Download 方法将远程文件保存到本地磁盘:
- 远程路径是服务器上的绝对或相对路径(相对于当前工作目录)
- 本地目标路径需包含完整文件名,父目录须已存在,否则会报错
- 若需校验完整性,可在下载后对比
MD5或SHA256(需服务端支持MD5命令或额外 API) - 示例:
err := conn.Download("/remote.log", "local.log")
不复杂但容易忽略:FTP 被动模式下,客户端需能接受来自服务器的随机端口连接,防火墙或 NAT 环境中可能失败;此时可尝试启用主动模式(conn.SetPassive(false)),但需确保客户端端口可被服务器访问。









