Golang 使用 net 包 通过 FTP 发送文件到指定目录
以下是使用 Golang 通过 FTP 发送文件到指定目录的示例代码:
package main
import (
"fmt"
"io/ioutil"
"net"
"os"
)
func main() {
// FTP 服务器地址
ftpServer := 'ftp.example.com'
// FTP 服务器端口
ftpPort := '21'
// FTP 登录用户名
ftpUser := 'username'
// FTP 登录密码
ftpPasswd := 'password'
// 本地文件路径
localFile := '/path/to/local/file'
// 远程文件路径
remoteFile := '/path/to/remote/file'
// 连接 FTP 服务器
conn, err := net.Dial('tcp', ftpServer + ':' + ftpPort)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
// 读取 FTP 服务器返回的欢迎信息
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf[:n]))
// 发送用户名
_, err = conn.Write([]byte('USER ' + ftpUser + '\r\n'))
if err != nil {
fmt.Println(err)
return
}
// 读取 FTP 服务器返回的响应
n, err = conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf[:n]))
// 发送密码
_, err = conn.Write([]byte('PASS ' + ftpPasswd + '\r\n'))
if err != nil {
fmt.Println(err)
return
}
// 读取 FTP 服务器返回的响应
n, err = conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf[:n]))
// 打开被动模式
_, err = conn.Write([]byte('PASV\r\n'))
if err != nil {
fmt.Println(err)
return
}
// 读取 FTP 服务器返回的响应
n, err = conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf[:n]))
// 解析被动模式的响应
var ip1, ip2, ip3, ip4, port1, port2 int
fmt.Sscanf(string(buf), '227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)',
&ip1, &ip2, &ip3, &ip4, &port1, &port2)
// 计算被动模式的端口
port := port1*256 + port2
addr := fmt.Sprintf('%d.%d.%d.%d:%d', ip1, ip2, ip3, ip4, port)
// 连接被动模式的数据传输通道
dataConn, err := net.Dial('tcp', addr)
if err != nil {
fmt.Println(err)
return
}
defer dataConn.Close()
// 打开二进制传输模式
_, err = conn.Write([]byte('TYPE I\r\n'))
if err != nil {
fmt.Println(err)
return
}
// 读取 FTP 服务器返回的响应
n, err = conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf[:n]))
// 发送 STOR 命令,上传文件
_, err = conn.Write([]byte('STOR ' + remoteFile + '\r\n'))
if err != nil {
fmt.Println(err)
return
}
// 读取 FTP 服务器返回的响应
n, err = conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf[:n]))
// 读取本地文件内容并写入数据传输通道
file, err := os.Open(localFile)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println(err)
return
}
_, err = dataConn.Write(data)
if err != nil {
fmt.Println(err)
return
}
fmt.Println('File uploaded successfully!')
}
这段代码会从本地文件路径读取文件内容,通过 FTP 连接上传到远程文件路径指定的目录中。在使用时,需要将示例代码中的 FTP 服务器地址、端口、用户名、密码、本地文件路径、远程文件路径等信息替换成实际的值。
本示例代码展示了如何使用 Golang 的 net 包与 FTP 服务器进行通信,实现文件上传功能。你可以根据自己的需求修改代码,例如添加错误处理、进度条显示等功能。
原文地址: https://www.cveoy.top/t/topic/oznd 著作权归作者所有。请勿转载和采集!