Zenn
🐥

GoでFTP操作を実現!「github.com/jlaffaye/ftp」を使ったサンプルコード解説

2025/03/24に公開

この記事では、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

ログインするとコメントできます