Golang 使用 net 包通过 FTP 发送文件到指定目录
以下是使用 Golang 的 net 包通过 FTP 发送文件到指定目录的示例代码:
package main
import (
"fmt"
"io"
"net"
"os"
)
func main() {
// FTP 服务器地址和端口
ftpServer := 'ftp.example.com:21'
// FTP 用户名和密码
ftpUser := 'username'
ftpPasswd := 'password'
// 本地文件路径和文件名
localFilePath := '/path/to/local/file.txt'
// 远程 FTP 目录和文件名
remoteDir := '/path/to/remote/directory'
remoteFileName := 'file.txt'
// 建立 FTP 连接
conn, err := net.Dial('tcp', ftpServer)
if err != nil {
fmt.Println('Failed to connect to FTP server:', err)
return
}
defer conn.Close()
// 读取 FTP 服务器返回的欢迎消息
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println('Failed to read welcome message:', err)
return
}
fmt.Println(string(buf[:n]))
// 发送 FTP 用户名和密码
fmt.Fprintf(conn, 'USER %s\r\n', ftpUser)
n, err = conn.Read(buf)
if err != nil {
fmt.Println('Failed to read response for USER command:', err)
return
}
fmt.Println(string(buf[:n]))
fmt.Fprintf(conn, 'PASS %s\r\n', ftpPasswd)
n, err = conn.Read(buf)
if err != nil {
fmt.Println('Failed to read response for PASS command:', err)
return
}
fmt.Println(string(buf[:n]))
// 切换 FTP 工作目录
fmt.Fprintf(conn, 'CWD %s\r\n', remoteDir)
n, err = conn.Read(buf)
if err != nil {
fmt.Println('Failed to read response for CWD command:', err)
return
}
fmt.Println(string(buf[:n]))
// 打开 FTP 被动模式数据连接
fmt.Fprintf(conn, 'PASV\r\n')
n, err = conn.Read(buf)
if err != nil {
fmt.Println('Failed to read response for PASV command:', err)
return
}
fmt.Println(string(buf[:n]))
// 解析 FTP 被动模式数据连接地址和端口
var addr string
var port int
_, err = fmt.Sscanf(string(buf[:n]), '227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)',
&addr, &addr, &addr, &addr, &port, &port)
if err != nil {
fmt.Println('Failed to parse PASV response:', err)
return
}
dataConn, err := net.Dial('tcp', fmt.Sprintf('%s:%d', addr, port))
if err != nil {
fmt.Println('Failed to connect to data connection:', err)
return
}
// 发送 FTP STOR 命令并上传文件
fmt.Fprintf(conn, 'STOR %s\r\n', remoteFileName)
n, err = conn.Read(buf)
if err != nil {
fmt.Println('Failed to read response for STOR command:', err)
return
}
fmt.Println(string(buf[:n]))
file, err := os.Open(localFilePath)
if err != nil {
fmt.Println('Failed to open local file:', err)
return
}
defer file.Close()
_, err = io.Copy(dataConn, file)
if err != nil {
fmt.Println('Failed to upload file:', err)
return
}
dataConn.Close()
// 读取 FTP 服务器上传文件的响应消息
n, err = conn.Read(buf)
if err != nil {
fmt.Println('Failed to read response for file upload:', err)
return
}
fmt.Println(string(buf[:n]))
}
该代码示例演示了如何使用 Golang 的 net 包通过 FTP 协议发送文件到指定目录。代码涵盖了以下步骤:
- 建立 FTP 连接
- 发送用户名和密码进行身份验证
- 切换到目标目录
- 打开 FTP 被动模式数据连接
- 解析数据连接地址和端口
- 发送
STOR命令并上传文件 - 关闭数据连接
- 读取 FTP 服务器的响应消息
请注意,该示例代码中的 FTP 服务器地址、用户名、密码、本地文件路径和远程目录应替换为实际值。
此外,您可能需要根据具体的 FTP 服务器配置调整代码中的部分细节,例如使用不同的端口号或协议版本。
原文地址: https://www.cveoy.top/t/topic/ozqf 著作权归作者所有。请勿转载和采集!