ひでっぷの技術メモ

はてなダイアリーから移行しました

FTPクライアントの作成(Jakarta Commons Net編)

前回のFTPクライアントの作成(Socket編)だとユーザー/パスワードが間違っていたりFTPサーバー自体が動いていなかったりした場合のエラー処理が全くしてありません。
FTPサーバーからの受信内容を解析して処理をすればいいんですが面倒くさい。
で、そんなことをすべてやってくれるのがJakarta Commons NetのFTPClientクラスです。

今回参考にしたのはJakarta Commonsによるネットワークプログラミングです。
こちらをもとに作成したプログラムがこちら。


/**
* ファイルをUploadする
* @param data String
* @param fileName String
* @throws SocketException
* @throws IOException
*/
public void upload(String data, String fileName) throws SocketException,
IOException {

FTPClient client = null;
OutputStream out = null;
try {
client = new FTPClient();
//1.FTPサーバーへ接続
client.connect("xxx.xxx.xxx.xxx");

//2.正常に接続できたかを判定する
if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
throw new IOException("Ftp not Conectted ReplyCode=" +
client.getReplyCode());
}

//3.ログイン処理
if (!client.login("ユーザー名", "パスワード")) {
throw new IOException("login failed");
}

//4.内容を直接OutputStreamに書き込む
out = client.storeFileStream(fileName);
out.write(data.getBytes());
out.flush();

}
finally {
if (out != null) {
out.close();
}
if (client != null && client.isConnected()) {
//5.FTPサーバーからログアウト
client.logout();
//6.FTPサーバーから切断
client.disconnect();

}
}

}

流れはSocket編とあまり変わりませんが、ログイン処理は結果がbooleanで返ってくるので楽ちんです。
ファイルのuploadにはまさしくファイルをそのまま上げるタイプの

FtpClient.storeFile(java.lang.String remote, java.io.InputStream local) 

もありましたが、ローカル内にファイルを作成したくなかったので
FtpClient.storeFile(String filename)

でOutputStreamを取得し、直接データを書き込むようにしました。
それとFtpClientをログアウトしないとタイムアウトするまでdiconnectできない時があるので注意が必要です。

前回のSocket編に比べてさらにシンプルになった上にエラー処理をきちんとしてくれるので大変便利です。