以下是使用 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 服务器进行通信,实现文件上传功能。你可以根据自己的需求修改代码,例如添加错误处理、进度条显示等功能。

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

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

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