🐥
GoでFTP操作を実現!「github.com/jlaffaye/ftp」を使ったサンプルコード解説
この記事では、Go言語でFTPサーバーに接続し、基本的な操作(接続・ログイン、ディレクトリ一覧の取得、ファイルのアップロード・ダウンロード)を行う方法を解説します。シンプルなサンプルコードを通して、主要な処理の実装方法を見ていきましょう。
1. 事前準備
まず、以下のコマンドでパッケージをインストールしてください。
go get github.com/jlaffaye/ftp
2. サンプルコード
以下のコードは、FTPサーバーへの接続からファイルのアップロード、ダウンロードまでを実装したサンプルです。
package main
import (
"fmt"
"io"
"log"
"os"
"time"
"github.com/jlaffaye/ftp"
)
func main() {
// FTPサーバーに接続
ftpServer := "ftp.example.com:21" // サーバーアドレスとポート
c, err := ftp.Dial(ftpServer, ftp.DialWithTimeout(5*time.Second))
if err != nil {
log.Fatal("接続エラー:", err)
}
defer c.Quit() // プログラム終了時に切断
// ログイン
username := "your_username"
password := "your_password"
if err := c.Login(username, password); err != nil {
log.Fatal("ログインエラー:", err)
}
// ディレクトリの一覧を取得
entries, err := c.List("/")
if err != nil {
log.Fatal("ディレクトリ一覧取得エラー:", err)
}
fmt.Println("ディレクトリ一覧:")
for _, entry := range entries {
fmt.Printf("Name: %s, Type: %s, Size: %d\n", entry.Name, entry.Type, entry.Size)
}
// ファイルのアップロード
localFile := "local_file.txt" // ローカルに存在するファイル
remoteFile := "remote_file.txt" // アップロード先のファイル名
file, err := os.Open(localFile)
if err != nil {
log.Fatal("ローカルファイルオープンエラー:", err)
}
defer file.Close()
if err := c.Stor(remoteFile, file); err != nil {
log.Fatal("ファイルアップロードエラー:", err)
}
fmt.Println("ファイルのアップロードに成功しました。")
// ファイルのダウンロード
r, err := c.Retr(remoteFile)
if err != nil {
log.Fatal("ファイルダウンロード開始エラー:", err)
}
defer r.Close()
downloadedFile := "downloaded_file.txt" // ダウンロード先のファイル名
out, err := os.Create(downloadedFile)
if err != nil {
log.Fatal("ローカルファイル作成エラー:", err)
}
defer out.Close()
if _, err := io.Copy(out, r); err != nil {
log.Fatal("ファイルダウンロードエラー:", err)
}
fmt.Println("ファイルのダウンロードに成功しました。")
}
3. 各処理の解説
3.1 FTPサーバーへの接続
-
Dial関数
ftp.Dial
を使ってFTPサーバーに接続します。DialWithTimeout
オプションを使うことで、接続タイムアウトを設定できます。c, err := ftp.Dial(ftpServer, ftp.DialWithTimeout(5*time.Second))
3.2 ログイン処理
-
Login関数
接続後は、c.Login(username, password)
で認証を行います。エラーが発生した場合はログを出力してプログラムを終了します。
3.3 ディレクトリ一覧の取得
-
List関数
c.List("/")
を使用してルートディレクトリの内容を取得しています。返されるスライスには、ファイルやディレクトリの情報が含まれており、名前や種類、サイズを出力できます。
3.4 ファイルのアップロード
-
Stor関数
ローカルファイルをos.Open
で読み込み、c.Stor(remoteFile, file)
を使ってFTPサーバーへアップロードします。アップロード前にファイルの存在チェックやエラーハンドリングを行うことが重要です。
3.5 ファイルのダウンロード
-
Retr関数とio.Copy
c.Retr(remoteFile)
でFTPサーバー上のファイルを取得し、io.Copy
を使用してローカルファイルに書き込みます。この方法により、ファイルの内容をストリームとして効率的に転送できます。
4. まとめ
今回紹介したサンプルコードは、GoでFTP操作を行うための基本的な流れを示しています。実際の開発では、エラーハンドリングの強化や、接続の再試行、セキュリティ面の考慮など、用途に合わせた工夫が必要になるでしょう。
このサンプルを参考に、あなたのプロジェクトでFTP操作を実装してみてください!
Discussion