Go标准库不支持FTP,需用github.com/jlaffaye/ftp库实现上传下载;支持主动/被动模式,示例含连接、登录、下载(io.Copy)、上传(Stor)、目录创建及超时等关键要点。

Go语言标准库不直接支持FTP协议,但可以借助第三方库 github.com/jlaffaye/ftp 快速实现FTP客户端的上传与下载功能。该库轻量、稳定,兼容大多数FTP服务器(包括主动/被动模式),适合日常文件传输需求。
安装FTP客户端库
执行以下命令安装官方维护较活跃的FTP库:
go get github.com/jlaffaye/ftp
连接FTP服务器并登录
创建连接前需明确服务器地址、端口(默认21)、用户名和密码。注意:该库默认使用被动模式(PASV),适合大多数NAT/防火墙环境。
立即学习“go语言免费学习笔记(深入)”;
示例代码:
一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!
conn, err := ftp.Dial("ftp.example.com:21", ftp.DialWithTimeout(5*time.Second))
if err != nil {
log.Fatal(err)
}
defer conn.Quit()
err = conn.Login("username", "password")
if err != nil {
log.Fatal(err)
}
从远程服务器下载文件
使用 conn.Retr() 获取文件读取器,再写入本地文件。注意处理二进制内容(如图片、压缩包)时应以 os.O_CREATE | os.O_WRONLY | os.O_TRUNC 模式打开文件,并避免文本换行符转换。
- 确保目标目录存在,否则
os.OpenFile会失败 - 建议用
io.Copy流式传输,节省内存 - 小文件可直接读到字节切片;大文件务必流式处理
示例:
reader, err := conn.Retr("/remote/file.zip")
if err != nil {
log.Fatal(err)
}
defer reader.Close()
file, err := os.OpenFile("./local-file.zip", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
_, err = io.Copy(file, reader)
if err != nil {
log.Fatal(err)
}
向远程服务器上传文件
使用 conn.Stor() 获取写入器,将本地文件内容写入。路径为远程服务器上的完整路径(支持子目录,需确保上级目录已存在)。
- 若目标目录不存在,上传会失败,需提前用
conn.Mkd()创建 - 文本文件注意编码一致性;二进制文件无需额外处理
- 上传过程中断可结合
io.CopyN或重试逻辑增强健壮性
示例:
file, err := os.Open("./local-file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
writer, err := conn.Stor("/remote/uploaded.txt")
if err != nil {
log.Fatal(err)
}
defer writer.Close()
_, err = io.Copy(writer, file)
if err != nil {
log.Fatal(err)
}
不复杂但容易忽略:超时控制、目录权限、字符集(尤其含中文路径时建议用UTF-8并确认服务端支持)、以及连接复用场景下的状态管理。生产环境建议封装成结构体,统一处理重连与错误日志。









