ホームページ >バックエンド開発 >Golang >Go での FTP の使用: 完全ガイド

Go での FTP の使用: 完全ガイド

PHPz
PHPzオリジナル
2023-06-17 18:31:053181ブラウズ

インターネットの急速な発展に伴い、ファイル転送プロトコル (FTP) は常に重要なファイル転送方法となっています。 Go 言語では、FTP を使用してファイルを転送することが多くの開発者のニーズとなる可能性があります。しかし、Go言語でのFTPの使い方がわからない人も多いのではないでしょうか。この記事では、FTPサーバーへの接続からファイル転送まで、Go言語でFTPを使う方法と、エラーや例外の処理方法について解説します。

FTP 接続の作成

Go 言語では、標準の「net」パッケージを使用して FTP サーバーに接続し、ファイル転送操作を実行できます。まず、FTP 接続を確立する必要があります。 「net.Dial」機能を使用すると、FTP サーバーと通信するためのネットワーク接続を作成できます。この例では、FTP サーバーを使用します。

package main

import (
    "fmt"
    "net"
)

func main() {
    conn, err := net.Dial("tcp", "ftp.mozilla.org:21")
    if err != nil {
        fmt.Println("Error connecting to server:", err)
        return
    }
    fmt.Println("Connected to server")
    conn.Close()
}

FTP クライアントを使用してサーバーにログインする

接続が確立されたら、FTP クライアントを使用してログインする必要があります。 「net/textproto」パッケージの「NewConn」関数を使用すると、FTP サーバーと通信するための読み取り/書き込み接続を作成できます。次に、「ログイン」機能を使用して認証する必要があります。

package main

import (
    "fmt"
    "net"
    "net/textproto"
)

func main() {
    conn, err := net.Dial("tcp", "ftp.mozilla.org:21")
    if err != nil {
        fmt.Println("Error connecting to server:", err)
        return
    }
    defer conn.Close()
    fmt.Println("Connected to server")

    client := textproto.NewConn(conn)
    _, err = client.Cmd("USER anonymous")
    if err != nil {
        fmt.Println("Error sending user command:", err)
        return
    }
    _, err = client.Cmd("PASS password")
    if err != nil {
        fmt.Println("Error sending password command:", err)
        return
    }
    fmt.Println("Logged in as anonymous")
}

FTP クライアント コマンド

FTP クライアント コマンドは、コマンドを文字列の形式で FTP サーバーに送信します。一般的な FTP クライアント コマンドは次のとおりです。

  • USER - FTP サーバーにログインするためのユーザー名。
  • PASS - FTP サーバーにログインするためのパスワード。
  • PWD - 現在のサーバー ディレクトリを表示します。
  • CWD - 現在のサーバー ディレクトリを変更します。
  • LIST - 現在のディレクトリのファイルとサブディレクトリを一覧表示します。
  • RETR - サーバーからファイルをダウンロードします。
  • STOR - ファイルをサーバーにアップロードします。
  • DELE - サーバー上のファイルを削除します。
  • RNFR - ファイルソースの名前を変更します。
  • RNTO - ファイルターゲットの名前を変更します。

FTP クライアント ファイルのアップロードとダウンロード

接続が確立され、FTP クライアント経由でログインしたら、ファイルを転送できます。 Go 言語では、FTP クライアントを使用したファイルの転送は非常に簡単です。ファイルをダウンロードするには「RETR」コマンドを、ファイルをアップロードするには「STOR」コマンドを使用するだけです。 「io」パッケージの「Copy」機能を使用すると、ファイルの内容を FTP サーバーからローカル ファイルにコピーしたり、ローカル ファイルの内容を FTP サーバーにコピーしたりできます。

FTP クライアントを使用してファイルをダウンロードする方法を見てみましょう。

package main

import (
    "fmt"
    "io"
    "net"
    "net/textproto"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "ftp.mozilla.org:21")
    if err != nil {
        fmt.Println("Error connecting to server:", err)
        return
    }
    defer conn.Close()
    fmt.Println("Connected to server")

    client := textproto.NewConn(conn)
    _, err = client.Cmd("USER anonymous")
    if err != nil {
        fmt.Println("Error sending user command:", err)
        return
    }
    _, err = client.Cmd("PASS password")
    if err != nil {
        fmt.Println("Error sending password command:", err)
        return
    }
    fmt.Println("Logged in as anonymous")

    _, err = client.Cmd("TYPE I")
    if err != nil {
        fmt.Println("Error sending type command:", err)
        return
    }

    _, err = client.Cmd("PASV")
    if err != nil {
        fmt.Println("Error sending pasv command:", err)
        return
    }
    response, err := client.ReadLine()
    if err != nil {
        fmt.Println("Error reading pasv response:", err)
        return
    }
    fmt.Println(response)

    _, err = client.Cmd("RETR /pub/README.txt")
    if err != nil {
        fmt.Println("Error sending retr command:", err)
        return
    }

    response, err = client.ReadLine()
    if err != nil {
        fmt.Println("Error reading retr response:", err)
        return
    }
    fmt.Println(response)

    file, err := os.Create("README.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    defer file.Close()

    _, err = io.Copy(file, conn)
    if err != nil {
        fmt.Println("Error copying file:", err)
        return
    }

    fmt.Println("Downloaded README.txt")
}

FTP クライアントを使用してファイルをアップロードする方法を見てみましょう。

package main

import (
    "fmt"
    "io"
    "net"
    "net/textproto"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "ftp.mozilla.org:21")
    if err != nil {
        fmt.Println("Error connecting to server:", err)
        return
    }
    defer conn.Close()
    fmt.Println("Connected to server")

    client := textproto.NewConn(conn)
    _, err = client.Cmd("USER anonymous")
    if err != nil {
        fmt.Println("Error sending user command:", err)
        return
    }
    _, err = client.Cmd("PASS password")
    if err != nil {
        fmt.Println("Error sending password command:", err)
        return
    }
    fmt.Println("Logged in as anonymous")

    _, err = client.Cmd("TYPE I")
    if err != nil {
        fmt.Println("Error sending type command:", err)
        return
    }

    _, err = client.Cmd("PASV")
    if err != nil {
        fmt.Println("Error sending pasv command:", err)
        return
    }
    response, err := client.ReadLine()
    if err != nil {
        fmt.Println("Error reading pasv response:", err)
        return
    }
    fmt.Println(response)

    _, err = client.Cmd("STOR /public_html/test.txt")
    if err != nil {
        fmt.Println("Error sending stor command:", err)
        return
    }

    file, err := os.Open("test.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()

    _, err = io.Copy(conn, file)
    if err != nil {
        fmt.Println("Error copying file:", err)
        return
    }

    response, err = client.ReadLine()
    if err != nil {
        fmt.Println("Error reading store response:", err)
        return
    }
    fmt.Println(response)

    fmt.Println("Uploaded test.txt")
}

エラーと例外の処理

ファイル転送に FTP クライアントを使用する場合、例外とエラーを処理することが非常に重要です。エラーが発生した場合、クライアントはユーザーが問題を特定して解決できるように、エラー情報をユーザーに返すことができる必要があります。以下は、エラーと例外を処理する方法を示す FTP クライアントを使用した例です。

package main

import (
    "fmt"
    "io"
    "net"
    "net/textproto"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "ftp.mozilla.org:21")
    if err != nil {
        fmt.Println("Error connecting to server:", err)
        return
    }
    defer conn.Close()
    fmt.Println("Connected to server")

    client := textproto.NewConn(conn)
    _, err = client.Cmd("USER anonymous")
    if err != nil {
        fmt.Println("Error sending user command:", err)
        return
    }
    _, err = client.Cmd("PASS password")
    if err != nil {
        fmt.Println("Error sending password command:", err)
        return
    }
    fmt.Println("Logged in as anonymous")

    _, err = client.Cmd("TYPE I")
    if err != nil {
        fmt.Println("Error sending type command:", err)
        return
    }

    _, err = client.Cmd("PASV")
    if err != nil {
        fmt.Println("Error sending pasv command:", err)
        return
    }
    response, err := client.ReadLine()
    if err != nil {
        fmt.Println("Error reading pasv response:", err)
        return
    }
    fmt.Println(response)

    _, err = client.Cmd("RETR /pub/README.txt")
    if err != nil {
        fmt.Println("Error sending retr command:", err)
        return
    }

    response, err = client.ReadLine()
    if err != nil {
        fmt.Println("Error reading retr response:", err)
        return
    }
    fmt.Println(response)

    file, err := os.Create("README.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    defer file.Close()

    _, err = io.Copy(file, conn)
    if err != nil {
        fmt.Println("Error copying file:", err)
        return
    }

    fmt.Println("Downloaded README.txt")

    _, err = client.Cmd("QUIT")
    if err != nil {
        fmt.Println("Error sending quit command:", err)
        return
    }
}

結論

この記事では、FTP 接続の確立、FTP クライアントを使用した FTP サーバーへのログイン、FTP クライアント コマンド、ファイルのアップロードなど、Go 言語で FTP を使用する方法を学習しました。とダウンロード、およびエラーと例外を処理する方法。 FTP を使用してファイルを転送することは、多くの開発者のニーズかもしれませんが、標準ライブラリの「net」および「io」パッケージを使用して FTP 接続を作成し、ファイル転送を実行できるため、Go 言語で FTP クライアントを使用することは難しくありません。次に、この知識を使用して独自の FTP クライアントを開発したり、独自のファイル転送のニーズに対応したりできます。

以上がGo での FTP の使用: 完全ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。