以下是一个使用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服务器返回的错误响应

golang 使用netftp包 通过ftp 发送文件到指定目录

原文地址: https://www.cveoy.top/t/topic/gZ5Y 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录