- PR -

FTPClientでのログ取得方法

1
投稿者投稿内容
キタキツネ
常連さん
会議室デビュー日: 2006/11/23
投稿数: 32
お住まい・勤務地: 沖縄県名護市
投稿日時: 2007-04-05 10:23
こんにちは。2点質問させてください。
1点目:
FTPClient処理を行った場合に、実際に発行されるFTPコマンドをログとして残したいのですが、ログを取得する方法はあるでしょうか?

2点目:
バイナリモードでファイルを転送するには以下のコマンド合っているでしょうか?
FTPClient ftp;
ftp.setFileType(FTPClient.IMAGE_FILE_TYPE);

setFileTransferMode()を使用するような気がするのですが該当する定数が切られていませんでした。
※参照URLを参考ください

nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-05 10:35
何のライブラリの話ですか?
apache commonsでしょうか?
キタキツネ
常連さん
会議室デビュー日: 2006/11/23
投稿数: 32
お住まい・勤務地: 沖縄県名護市
投稿日時: 2007-04-05 13:21
>nagiseさん

はい。Apache Commonsになります。
パッケージは以下になります。
org.apache.commons.net.ftp.FTPClient

Apache Commons net
http://jakarta.apache.org/commons/net/
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-04-11 18:27
1点目ですが、言葉で説明するのが面倒だったのでサンプルコード置いておきますね。
いい方法かはわかりませんが、こんな感じで行けるかと思います。
コード:
    FTPClient client = new FTPClient() {
        public OutputStream getOutputStream() {
            return new VerboseOutputStream( super.getOutputStream() );
        }
    };

    static class VerboseOutputStream extends FilterOutputStream {
        ByteArrayOutputStream log;
        public VerboseOutputStream( OutputStream _out ) {
            super( _out );
            log = new ByteArrayOutputStream();
        }
        public void write( byte[] _b, int _off, int _len ) throws IOException {
            out.write( _b, _off, _len );
            log.write( _b, _off, _len );
        }
        public void write( byte[] _b ) throws IOException {
            out.write( _b );
            log.write( _b );
        }
        public void write( int _b ) throws IOException {
            out.write( _b );
            log.write( _b );
        }
        public void flush() throws IOException {
            out.flush();
            System.out.println( new String( this.log.toByteArray() ) ); // ここを適宜変更
            log.reset();
        }
    }



2点目はおっしゃる手順でバイナリーモードになります。
余談ですが、FTPClient.BINARY_FILE_TYPE を渡してもいいみたいですね。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-04-11 20:35
うっかりしていましたが、さっきのサンプルコードはコマンド以外のデータ部分も出力しちゃうかもしれませんね。
今は環境がないので、直ぐには検証できませんが・・。

# 碌に検証もしないで、サンプルなんて投稿するもんじゃないですね・・。orz
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-04-12 14:14
時間ができたので、サンプルコードの検証をしたところ、データ部分はログに出力されずに上手くいっていました。

サンプルコードでオーバーライドしている getOutputStream() は FTPClient 祖父クラス(?)である TelnetClient で定義されているもので、データ部分のソケットは FTPClient 自身でオープンしていました。

# よかったぁ。
# ってか、反応無いところを見ると、スレ主はすでに解決している予感・・・。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-12 16:00
>でゅうく氏

情報ありがとうございます。
参考になります。

こういった調査は労力がかかりますので情報提供がとても有難いです。
あしがかりになりますので出せるサンプルは検証の程度によらず
有難いものですよ。
キタキツネ
常連さん
会議室デビュー日: 2006/11/23
投稿数: 32
お住まい・勤務地: 沖縄県名護市
投稿日時: 2007-04-27 11:31
でゅうくさん

返答遅れてすいません。回答頂いたことに気付きませんでしたm(_ _)m
サンプルコードのご提供、ありがとうございます!
こちらを参考に実装したいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)