外部連携を行う際、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(Errorerror ,stringcurrentDir)currentDirはサーバー応答に含まれている場合に設定されます。
ftp.get( path, callback )
サーバーから指定したパスにあるデータを受信します。
- path
-
Type:
string移動先のパスを バックスラッシュ "/" 区切りで指定します。
- callback
-
Type:
function(Errorerror ,ReadableStreamstream)streamは受信したファイルのストリームが渡されます。
ftp.put( src, dis, callback )
サーバーからファイルを取得します。
- src
-
Type:
ReadableStream/Buffer/string送信したいファイルのストリームまたはローカルファイルパスを指定します。
- dist
-
Type:
string送信先のパスを バックスラッシュ "/" 区切りで指定します。
- callback
-
Type:
function(Errorerror )送信完了したら呼び出されます。
今回の記事は参考になったでしょうか? 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";を記述する
参考記事
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!