以下是使用 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 协议发送文件到指定目录。代码涵盖了以下步骤:

  1. 建立 FTP 连接
  2. 发送用户名和密码进行身份验证
  3. 切换到目标目录
  4. 打开 FTP 被动模式数据连接
  5. 解析数据连接地址和端口
  6. 发送 STOR 命令并上传文件
  7. 关闭数据连接
  8. 读取 FTP 服务器的响应消息

请注意,该示例代码中的 FTP 服务器地址、用户名、密码、本地文件路径和远程目录应替换为实际值。

此外,您可能需要根据具体的 FTP 服务器配置调整代码中的部分细节,例如使用不同的端口号或协议版本。

Golang 使用 net 包通过 FTP 发送文件到指定目录

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

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