外部連携を行う際、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";
を記述する
参考記事
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!