如何使用Golang实现FTP客户端_上传下载远程文件

21次阅读

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

如何使用Golang实现FTP客户端_上传下载远程文件

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并确认服务端支持)、以及连接复用场景下的状态管理。生产环境建议封装结构体,统一处理重连与错误日志。

text=ZqhQzanResources