Home > Java > JavaでFTPアップロードを行う。

JavaでFTPアップロードを行う。

  • Posted by: sinsengumi
  • 2011年2月1日 9:00 PM
  • Java
  • |

JavaでFTPを使用するにはいくらか方法がありますが、仕事でcommons-netのFTPを使ったのでその備忘録です。

実行環境は以下です。

  • JRE 1.6
  • commons-net-2.0.jar

はまった箇所が2点ほどあって、ひとつはエンコーディングの設定は必ずコネクトする前に行うこと。とPASVモードについてです。

commons-netのFTPClientクラスで、PASVモードにできそうな名前のメソッドが2つあって、それのどっちを使えばいいのか、もしくは違うのか結構悩みました。

  • enterLocalPassiveMode()
  • enterRemotePassiveMode()

結果的にいうと、どっちも違くて、FTPClientの親クラスであるFTPクラスのpasv()メソッドでOKでした。
これらの違いは、ソースやJavadocを見た感じ、恐らく以下のような感じだと思います。

pasv()

FTPのPASVコマンドを発行する。

enterLocalPassiveMode()

dataConnectionModeを「2」に設定する。

enterRemotePassiveMode()

内部的にpasv()を呼び出している。

以下、サンプルコードです。

public class FTPUpload {

    private static final String FTP_HOST = "127.0.0.1";
    private static final String FTP_USER = "username";
    private static final String FTP_PASSWORD = "password";

    private static final String UPLOAD_FILE = "C:\\サンプル.xls";
    private static final String UPLOADED_FILENAME = "リネーム.xls";

    public static void main(String[] args) {
        try {
            execute();
        } catch (ApplicationException e) {
            e.printStackTrace();
        }
    }

    private static void execute() throws ApplicationException {

        FTPClient ftpClient = new FTPClient();

        try {
            // エンコーディングの設定は、connectする前に行う。
            ftpClient.setControlEncoding("SJIS");

            // FTPサーバに接続
            ftpClient.connect(FTP_HOST);
            printFtpReply(ftpClient);

            // ログイン
            ftpClient.login(FTP_USER, FTP_PASSWORD);
            printFtpReply(ftpClient);

            // PASVモードに設定
            ftpClient.pasv();
            printFtpReply(ftpClient);

            // データの変換モードをバイナリに設定
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            printFtpReply(ftpClient);

            // ファイル転送
            FileInputStream fis = new FileInputStream(UPLOAD_FILE);
            ftpClient.storeFile(UPLOADED_FILENAME, fis);
            printFtpReply(ftpClient);

        } catch (NumberFormatException e) {
            throw new ApplicationException("FTPポートの値が数値ではありません。", e);
        } catch (SocketException e) {
            throw new ApplicationException("Socket通信に失敗しました。", e);
        } catch (FileNotFoundException e) {
            throw new ApplicationException("アップロードするファイルが見つかりません。", e);
        } catch (IOException e) {
            throw new ApplicationException("IOレベルで例外が発生しました。", e);
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    // ignore
                }
            }
        }
    }

    private static void printFtpReply(FTPClient ftpClient)throws ApplicationException {

        System.out.print(ftpClient.getReplyString());

        int replyCode = ftpClient.getReplyCode();

        if (!FTPReply.isPositiveCompletion(replyCode)) {
            throw new ApplicationException("送信したFTPコマンドは失敗しました。");
        }
    }
}

PASVモードやFTPのプロトコルに関しては、以下が大変参考になりました。
http://www.atmarkit.co.jp/fnetwork/rensai/netpro10/netpro01.html

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://sinsengumi.net/blog/2011/02/java%e3%81%a7ftp%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%82%92%e8%a1%8c%e3%81%86%e3%80%82/trackback/
Listed below are links to weblogs that reference
JavaでFTPアップロードを行う。 from sinsengumi血風録

Home > Java > JavaでFTPアップロードを行う。

Search
Feeds
Meta

Return to page top