0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

この記事では、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操作を実装してみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?