システムで外部システムと連携する方法はいろいろありますが、FTPサーバを使ってファイルのやり取りで連携するパターンも多々あります。
FTPサーバを使ってファイルのやり取りをおこなう場合、プログラムからFTPサーバにログインして、ファイルのアップロードやダウンロードをおこなう必要が出てきます。
今回は、Javaを使ってFTPサーバとのファイル送受信をおこなうサンプルプログラムを紹介します。
環境情報
- OS:Windows10
- Java:Java1.8.0_60
- FTPサーバ:IIS(インターネットインフォメーションサービス)
JavaでFTPを使うために、「commons-net-3.6.jar」を使用しています。
FTPサーバについては、以前の記事で作成したIIS(インターネットインフォメーションサービス)を使います。
FTPサンプルプログラム
サンプルプログラムを紹介します。
サンプルプログラムのクラスは2つです。
FTPに対する操作をおこなうクラスとして「FtpMng.java」を準備し、「FtpMng.java」のインスタンスを使って処理をおこなうクラスが「FtpSample.java」になります。
以下のクラスがFTPに対する操作をおこなうクラスである「FtpMng.java」です。
FTPに対する操作一つ一つに対してメソッドを準備しています。
FTPサーバに対しておこなっているのは、ファイルのアップロード(FTPサイトにファイルを置く)と、ファイルのダウンロード(FTPサイトからファイルをもらう)の2つになります。
import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.SocketException; public class FtpMng { private FTPClient cli; // コンストラクタ public FtpMng() { } // 接続 public boolean connect() { int rep; System.out.print("start: connect\r\n"); try { cli = new FTPClient(); cli.setDataTimeout(60000); cli.connect("localhost"); rep = cli.getReplyCode(); if (!FTPReply.isPositiveCompletion(rep)) { return false; } System.out.print("end: connect\r\n"); return true; } catch (SocketException e) { return false; } catch (IOException ie) { return false; } } // ログイン public boolean login() { System.out.print("start: login\r\n"); try { if (!cli.login("ftp", "password")) { return false; } System.out.print("end: login\r\n"); return true; } catch (IOException ie) { return false; } } // ダウンロード public void downLoad() { FileOutputStream outputstream; boolean isRetrieve; System.out.print("start: downLoad\r\n"); try { outputstream = new FileOutputStream("download.txt"); isRetrieve = cli.retrieveFile("download.txt", outputstream); outputstream.close(); if (!isRetrieve) { System.out.print("error: downLoad\r\n"); } System.out.print("end: downLoad\r\n"); return; } catch (IOException ie) { return; } } // アップロード public void upLoad() { FileInputStream inputstream; boolean isStore; System.out.print("start: upLoad\r\n"); try { inputstream = new FileInputStream("upload.txt"); isStore = cli.storeFile("upload.txt", inputstream); inputstream.close(); if (!isStore) { System.out.print("error: upLoad\r\n"); } System.out.print("end: upLoad\r\n"); return; } catch (IOException ie) { return; } } // 切断 public boolean disConnect() { System.out.print("start: disConnect\r\n"); try { if (cli != null && cli.isConnected()) { cli.disconnect(); } System.out.print("end: disConnect\r\n"); return true; } catch (IOException ie) { return false; } } }
以下のクラスが実際にFTP処理をおこなう「FtpSample.java」です。
「FtpMng.java」に準備しているメソッドを順番に呼び出しているだけです。
public class FtpSample { public static void main(String[] args){ System.out.print("start: FtpSample\r\n"); FtpMng ftpClient = new FtpMng(); // 1:接続 ftpClient.connect(); // 2:ログイン ftpClient.login(); // 3:ダウンロード ftpClient.downLoad(); // 4:アップロード ftpClient.upLoad(); // 5:切断 ftpClient.disConnect(); System.out.print("end: FtpSample\r\n"); } }
FTPサンプルプログラムの解説
それでは以下に解説していきます。
そんなに難しいプログラムではないですが。
接続・ログイン・切断
FTPサーバに対してファイルをアップロード・ダウンロードする前に、FTPサーバにログインしなければいけません。
手順としては、接続→ログイン、の順番になります。
まずは接続です。
cli = new FTPClient(); cli.setDataTimeout(60000); cli.connect("localhost"); rep = cli.getReplyCode(); if (!FTPReply.isPositiveCompletion(rep)) { return false; }
正常に接続できたかどうか?については、getReplyCode()で返り値を取得し、FTPReplyクラスで返り値を検証することで判断することができます。
次にログインです。
if (!cli.login("ftp", "password")) { return false; }
IDとパスワードを指定してログインを実行です。
これでFTPサーバにログインできます。
ID | ftp |
パスワード | password |
一連の処理をおこなった後に切断して処理終了です。
if (cli != null && cli.isConnected()) { cli.disconnect(); }
サンプルプログラムでは、一応、FTPClientインスタンスが存在しており、かつ、接続されている場合に切断しています。
ダウンロード
FTPサーバからファイルを取得します。
outputstream = new FileOutputStream("download.txt"); isRetrieve = cli.retrieveFile("download.txt", outputstream); outputstream.close();
Javaのアウトプットストリームクラスを使用してFTPサーバからファイルをダウンロードしています。
ストリームのクローズは忘れずに、ですね。
アップロード
FTPサーバにファイルを格納します。
inputstream = new FileInputStream("upload.txt"); isStore = cli.storeFile("upload.txt", inputstream); inputstream.close();
こちらはダウンロードとは逆の方式です。
Javaのインプットストリームクラスを使用してFTPサーバにファイルをアップロードしています。
こちらも、ストリームのクローズは忘れずに、です。
まとめ
FTPサーバに対するファイル操作は、Javaで実装することが可能です。
サンプルプログラムでは必要最低限のソースコードしか紹介していませんが、FTPコマンドで可能な操作はJavaが全て可能です。
- FTPサーバに対する操作は、Javaで全て実装可能。
- サンプル以外のFTP操作についても可能