Node.js で FTP / FTPS 通信 を行う 方法

0 件のコメント

外部連携を行う際、HTTP / HTTPS の次に使いそうなのが FTP / FTPS 通信と思います。 今回は Node.js で FTP / FTPS 通信を行うサンプルコードを作成しました。 素のまま使うとコードが面倒になるので ftp モジュールを使った通信方法をまとめています。

ftp モジュール インストール

とりあえず、利用にあたって ftp モジュールのインストールを行っておきます。

npm install ftp --save

サンプルコード

ファイルダウンロード

FTPでダウンロード

ftp://192.168.86.135:21/test/sample.txt をダウンロードするサンプルコードを以下に載せます。

var fs = require("fs");
var Client = require("ftp");
var client = new Client();

client.connect({
  host: "192.168.86.135",
  port: 21,
  user: "ftpuser",
  password: "ftpuser"
});

client.on("ready", () => {
  client.get("test/sample.txt", (error, stream) => {
    if (error) {
      throw error;
    }
    stream.once('close', function () { client.end(); });
    stream.pipe(fs.createWriteStream(`./recieved/sample.local-copy_${(new Date()).getTime()}.txt`));
  });
});

L5-10
接続先のサーバー、ユーザー、パスワードを設定します。

L12
接続確立すると ready イベントが発生するので、後続操作は ready イベントのコールバックに指定します。

L13
必要なファイルを client.get(filename, callback) にてダウンロードします。 ディレクトリ変更が必要であれば client.cwd() を利用して移動しておきます。

FTPSでダウンロード

上記とほぼコードは同じです。 差分があるところをハイライトしました。

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0";

var fs = require("fs");
var Client = require("ftp");
var client = new Client();

client.connect({
  host: "192.168.86.135",
  port: 21,
  secure: true,
  user: "ftpuser",
  password: "ftpuser"
});

client.on("ready", () => {
  client.get("test/sample.txt", (error, stream) => {
    if (error) {
      throw error;
    }
    stream.once('close', function () { client.end(); });
    stream.pipe(fs.createWriteStream(`./recieved/sample.local-copy_${(new Date()).getTime()}.txt`));
  });
});

L1
FTPサーバーがオレオレ証明書を利用している場合、証明書エラーが発生します。 こうした場合はエラーを無視するオプション NODE_TLS_REJECT_UNAUTHORIZED を設定しておきます。

L10
FTPSアクセスする場合は secure 属性を指定します。

ファイルのアップロード

コードはダウンロードとほぼ変わりません。 アップロード時は put を使う点が異なります。

FTPでアップロード

var fs = require("fs");
var Client = require("ftp");
var client = new Client();

client.connect({
  host: "192.168.86.135",
  port: 21,
  user: "ftpuser",
  password: "ftpuser"
});

client.on("ready", () => {
  client.put("src.txt", "dist.txt", (error) => {
    if (error) {
      throw error;
    }
    client.end();
  });
});

FTPSでアップロード

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0";

var fs = require("fs");
var Client = require("ftp");
var client = new Client();

client.connect({
  host: "192.168.86.135",
  port: 21,
  secure: true,
  user: "ftpuser",
  password: "ftpuser"
});

client.on("ready", () => {
  client.put("src.txt", "dist.txt", (error) => {
    if (error) {
      throw error;
    }
    client.end();
  });
});

ftp モジュール API

readyイベント

接続と認証が終わったとき呼び出されます。

ftp.connect( config )

FTPサーバーへ接続します。

config

Type: object

サーバー接続に必要な設定を指定します。 指定できる設定プロパティは以下の通りです。

プロパティ名 デフォルト 説明
host string "localhost" FTPサーバーのホスト名またはIPアドレスを指定します。
port integer 21 FTPサーバーのポート番号を指定します。
secure boolean / "control" / "implicit" false 暗号化通信の設定を行います。
true
制御通信およびデータ通信の両方で暗号化通信を行います。
"control"
制御通信のみ暗号化通信を行います。
"implicit"
暗黙的暗号化制御接続を行います。(通常 990 ポートを利用します。最近ではあまり利用されません。)
secureOptions object (none) tls.connect() メソッドに渡すオプションを指定します。
user string "anonymous" 認証に使うユーザー名を指定します。
password string "anonymous@" 認証に使うパスワードを指定します。
connTimeout integer 10000 制御接続確立まで何ミリ秒まで待つかを指定します。
pasvTimeout integer 10000 PASVデータ接続で何ミリ秒まで待つかを指定します。
keepalive integer 10000 接続維持のために"dummy"(NOOP)コマンドを送信する間隔(ミリ秒)を指定します。

ftp.cwd( path, callback )

カレントディレクトリを path に変更します。

path

Type: string

移動先のパスを バックスラッシュ "/" 区切りで指定します。

callback

Type: function(Error error , string currentDir)

currentDir はサーバー応答に含まれている場合に設定されます。

ftp.get( path, callback )

サーバーから指定したパスにあるデータを受信します。

path

Type: string

移動先のパスを バックスラッシュ "/" 区切りで指定します。

callback

Type: function(Error error , ReadableStream stream)

stream は受信したファイルのストリームが渡されます。

ftp.put( src, dis, callback )

サーバーからファイルを取得します。

src

Type: ReadableStream / Buffer / string

送信したいファイルのストリームまたはローカルファイルパスを指定します。

dist

Type: string

送信先のパスを バックスラッシュ "/" 区切りで指定します。

callback

Type: function ( Error error )

送信完了したら呼び出されます。

今回の記事は参考になったでしょうか? Node.js で FTP/FTPS通信 を行うポイントは以下になります。 今回の記事も参考になれば幸いです。

  • FTP/FTPS には ftp モジュール を利用する
  • 接続は client.connect()
  • ディレクトリ変更は client.cwd()
  • ファイルダウンロードは client.get()
  • ファイルアップロードは client.put()
  • FTPS を利用する場合は client.connect()secure: true を指定する
  • オレオレ証明書を利用する場合は process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0"; を記述する

参考記事