外部連携を行う際、HTTP / HTTPS の次に使いそうなのが FTP / FTPS 通信と思います。
今回は Node.js で FTP / FTPS 通信を行うサンプルコードを作成しました。
素のまま使うとコードが面倒になるので ftp
モジュールを使った通信方法をまとめています。
ftp モジュール インストール
とりあえず、利用にあたって ftp
モジュールのインストールを行っておきます。
1 | npm install ftp --save |
サンプルコード
ファイルダウンロード
FTPでダウンロード
ftp://192.168.86.135:21/test/sample.txt
をダウンロードするサンプルコードを以下に載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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でダウンロード
上記とほぼコードは同じです。 差分があるところをハイライトしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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でアップロード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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でアップロード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 の フォロー」 お願いします!!