- 2012-09-23 (日) 17:23
- Android
AndroidでのFTP実装にはJavaのライブラリがそのまま使用できます。
Socketレベルでチマチマと実装してもいいのですが、Commons Netというライブラリを使うことで比較的簡単にFTP機能を実装することが出来ます。
今回はこのCommons Netを使った実装方法を紹介していきます。
- Commons Netライブラリをダウンロード
- サーバに接続
- ログイン
- 転送モードを設定
- ディレクトリ移動
- アップロード
- ダウンロード
- 削除
- 切断
Commons Netライブラリをダウンロード
Apache Commons Net™のダウンロードページからCommons Netライブラリをダウンロードします。
この記事を書いている段階での最新版はcommons-net-3.1-bin.zipとなっています。
ダウンロードしたファイルを解凍するとルートに[commons-net-3.1.jar]というファイルがあるので、これをプロジェクトのビルドパスに追加します。
サーバに接続
FTPClientクラスを使って処理を実装していきます。
setDefaultTimeout() で接続タイムアウト時間を設定し、connect() で接続します。
connect() の引数にはホストおよびポート番号を指定します。
String host = "127.0.0.1";
int port = 21;
FTPClient ftpClient = new FTPClient();
ftpClient.setDefaultTimeout(nTimeout);
ftpClient.connect(host, port);
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode()) == false) {
//-==- 接続エラー -==-//
}
getReplyCode() で応答コードを取得できます。
FTPReply.isPositiveCompletion() の引数に応答コードを渡すことで、処理が成功したかどうかを確認できます。
ログイン
setSoTimeout() でタイムアウト時間を設定し、login() でログインします。
login() の引数にはユーザ名とパスワードを指定します。
String user = "user";
String pass = "password";
//==== タイムアウト時間設定 ====//
ftpClient.setSoTimeout(timeout);
//==== ログイン ====//
if (ftpClient.login(user, pass) == false) {
//-==- 認証エラー -==-//
}
タイムアウト設定メソッド
接続時とログイン時でタイムアウト設定メソッドが異なることに気付いたでしょうか?
接続前はsetDefaultTimeout()、接続後はsetSoTimeout() でタイムアウト設定を行います。
さらに、この後出てくるデータ転送時には setDataTimeout() でタイムアウト設定する必要があります。
間違えないように注意しましょう。
転送モードを設定
setFileType() でファイル転送モードを設定します。
ASCIIモードを使う場合はFTP.ASCII_FILE_TYPE、バイナリモードを使う場合はFTP.BINARY_FILE_TYPEを引数として指定します。
また、enterLocalPassiveMode() を使うことでパッシブモードにすることができます。
//==== 転送モード設定 ====// ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode();
ディレクトリ移動
changeWorkingDirectory() でディレクトリを移動します。
ディレクトリが存在しなかった場合は失敗してしまうので、listNames() で事前にディレクトリの有無を確認し、対象ディレクトリがなければ makeDirectory() で作るなどの処理を入れておいた方が良いでしょう。
//==== ディレクトリ有無確認 ====//
boolean isExist = false;
String[] names = ftpClient.listNames();
for(String name : names) {
if(name.equals(dirName)) {
isExist = true;
}
}
//==== 存在しなければディレクトリ作成 ====//
if(!isExist) {
//-==- 存在しない -==-//
ftpClient.makeDirectory(dirName);
}
//==== ディレクトリ移動 ====//
if(ftpClient.changeWorkingDirectory(remotePath) == false) {
//-==- 失敗 -==-//
}
アップロード
storeFile() でファイルをアップロードします。
第1引数にサーバに保存するファイル名、第2引数にファイル入力ストリームを指定します。
String localFile = "ローカルファイル"; String serverFile = "サーバファイル"; //==== アップロード ====// FileInputStream is = new FileInputStream(localFile); ftpClient.storeFile(serverFile, is); is.close();
ダウンロード
retrieveFile() でファイルをダウンロードします。
第1引数にサーバ側ファイル名、第2引数にファイル出力ストリームを指定します。
String localFile = "ローカルファイル"; String serverFile = "サーバファイル"; //==== ダウンロード ====// FileOutputStream os = new FileOutputStream(localFile); ftpClient.retrieveFile(serverFile, os); os.close();
削除
ファイル削除には deleteFile() を使用します。
引数に削除対象のファイルを指定します。
String serverFile = "サーバファイル"; //==== ファイル削除 ====// ftpClient.deleteFile(serverFile);
切断
disconnect() で切断します。
//==== 切断 ====// ftpClient.disconnect();
サンプル
ローカルファイルをアップロードするサンプルです。
動作確認していないうえにいろいろと省略していますので、実際に使用する際は注意してください^^;
...
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class HogeActivity extends Activity
{
...
private void ftpUpload() {
String host = "127.0.0.1"; // ホスト
int port = 21; // ポート番号
String user = "user"; // ユーザ名
String password = "pass"; // パスワード
int timeout = 1000; // タイムアウト時間[ms]
FTPClient ftpClient = new FTPClient();
try {
//==== 接続 ====//
ftpClient.setDefaultTimeout(timeout);
ftpClient.connect(host, port);
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode()) == false) {
//-==- 接続エラー -==-//
throw new Exception("接続エラー");
}
//==== ログイン ====//
ftpClient.setSoTimeout(timeout);
if (ftpClient.login(user, password) == false) {
//-==- 認証エラー -==-//
throw new Exception("認証エラー");
}
//==== ルートディレクトリに移動 ====//
ftpClient.setDataTimeout(timeout);
if (ftpClient.changeWorkingDirectory("/") == false) {
//-==- ディレクトリ移動エラー -==-//
throw new Exception("ディレクトリ移動エラー");
}
//==== ファイル転送モード設定 ====//
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
//==== アップロード ====//
FileInputStream is = null;
is = new FileInputStream("アップロードファイルパス.txt");
ftpClient.storeFile("サーバ側ファイル名.txt", is);
is.close();
} catch (Exception e) {
// 例外時処理
}
finally {
//==== 切断 ====//
if(ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
// 例外時処理
}
}
}
}
}
上手くいかないときは・・・
通信できなかったりFTP処理に時間が掛かる場合は、以下項目を確認してみると幸せになれるかも知れません…。
- ファイヤーウォール
- セキュリティソフト
関連があると思われる記事:
- [Java] ディレクトリ内のファイル一覧取得
- [MS-DOS] ファイルのBOM追加/削除
- [Eclipse] 起動できないときは・・・
- [Android] Windows8でのAndroid Studio開発環境構築
- [Android] アプリケーション名とアイコン
- Newer: [WPF] 未処理例外をキャッチ
- Older: [Android] Backボタンが押されたときの処理
Comments:1
- 通りすがり 16-01-20 (水) 23:38
-
現在このように、メインスレッドでインターネット通信をしようとすると、エラーを吐かれてしまうので注意が必要です。
Trackbacks:0
- Trackback URL for this entry
- http://gacken.com/wp/program/android/1646/trackback/
- Listed below are links to weblogs that reference
- [Android] FTPクライアントの実装 from ミライニトドケ