golang 使用netftp包 通过ftp 发送文件到指定目录
以下是一个使用net/ftp包发送文件到指定目录的示例程序:
package main
import (
"fmt"
"net"
"net/textproto"
"os"
)
func main() {
// FTP服务器地址和端口
ftpAddr := "ftp.example.com:21"
// FTP登录用户名和密码
ftpUser := "username"
ftpPass := "password"
// 要发送的文件路径
localFilePath := "/path/to/local/file.txt"
// 目标文件名和目录路径
remoteFileName := "file.txt"
remoteDirPath := "/path/to/remote/directory/"
// 建立FTP连接
conn, err := net.Dial("tcp", ftpAddr)
if err != nil {
fmt.Println("FTP连接失败:", err)
return
}
defer conn.Close()
// 创建FTP客户端
ftpClient := textproto.NewConn(conn)
// 接收FTP服务器的欢迎消息
_, err = ftpClient.ReadLine()
if err != nil {
fmt.Println("FTP欢迎消息读取失败:", err)
return
}
// 发送登录请求
err = ftpClient.PrintfLine("USER %s", ftpUser)
if err != nil {
fmt.Println("FTP登录请求发送失败:", err)
return
}
// 接收登录响应
_, err = ftpClient.ReadLine()
if err != nil {
fmt.Println("FTP登录响应读取失败:", err)
return
}
// 发送密码请求
err = ftpClient.PrintfLine("PASS %s", ftpPass)
if err != nil {
fmt.Println("FTP密码请求发送失败:", err)
return
}
// 接收密码响应
_, err = ftpClient.ReadLine()
if err != nil {
fmt.Println("FTP密码响应读取失败:", err)
return
}
// 打开被动模式
err = ftpClient.PrintfLine("PASV")
if err != nil {
fmt.Println("FTP被动模式请求发送失败:", err)
return
}
// 接收被动模式响应
response, err := ftpClient.ReadLine()
if err != nil {
fmt.Println("FTP被动模式响应读取失败:", err)
return
}
// 解析被动模式响应
var host string
var port int
_, err = fmt.Sscanf(response, "227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)",
&host, &host, &host, &host, &port, &port)
if err != nil {
fmt.Println("FTP被动模式响应解析失败:", err)
return
}
// 建立数据连接
dataConn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", host, port))
if err != nil {
fmt.Println("FTP数据连接建立失败:", err)
return
}
defer dataConn.Close()
// 发送上传请求
err = ftpClient.PrintfLine("STOR %s", remoteDirPath+remoteFileName)
if err != nil {
fmt.Println("FTP上传请求发送失败:", err)
return
}
// 接收上传响应
_, err = ftpClient.ReadLine()
if err != nil {
fmt.Println("FTP上传响应读取失败:", err)
return
}
// 打开本地文件
localFile, err := os.Open(localFilePath)
if err != nil {
fmt.Println("本地文件打开失败:", err)
return
}
defer localFile.Close()
// 将本地文件内容写入数据连接
_, err = fmt.Fprintf(dataConn, "%s", localFile)
if err != nil {
fmt.Println("FTP数据连接写入失败:", err)
return
}
// 断开数据连接
err = dataConn.Close()
if err != nil {
fmt.Println("FTP数据连接断开失败:", err)
return
}
fmt.Println("文件上传成功")
}
在上面的示例程序中,我们首先建立了一个FTP连接,然后发送用户名和密码进行登录。接着,我们打开被动模式,建立数据连接,发送上传请求,并将本地文件内容写入数据连接。最后,我们断开数据连接,完成文件上传。
请注意,本示例仅适用于将文本文件上传到FTP服务器。如果您需要上传二进制文件,请使用io.Copy()函数将文件内容从本地文件复制到数据连接。此外,您还需要处理可能出现的错误,例如FTP服务器返回的错误响应
原文地址: https://www.cveoy.top/t/topic/gZ5Y 著作权归作者所有。请勿转载和采集!