hatenob

プログラムって分からないことだらけ

JavaでFTP

月に1つは何か試して記事書きたいなぁと思いますが、なかなか時間と体力がありません。

JavaFTP

JavaからFTPサーバにつないでファイルをアップロードするようなプログラムを書いてみました。
ソースはこちら。

chanko/chanko-ftp at master · nobrooklyn/chanko · GitHub

FTPの処理

Apache Commonsが一人、commons-netというので簡単に実装できました。
他にも色々なプロトコルに対応しているようです。

Apache Commons Net - Overview

はまったことその1

vsftpdを使って、Vagrant+ChefでCentOS6上にFTPサーバを立てたのだけれど、ローカルのWindows環境で何も考えずにファイルを作ったものだから、vsftpd.confの行終端がCRLFになっていてvsftpdの起動でこけた。
LFにしたら問題なく動いた。
いやまぁそうなんだろうけど、これ、僕が悪いの?

はまったことその2

ローカルのWindows環境に入ってるセキュリティソフトのおかげで、サーバにつながらなかった。
最初、何でなのか全く分からなくて、今でも何でなのか分かっていない。
SSHはつながってるのに、FTPはつながらない。
パッシブモードにしてあるので一方向のはず。
iptablesは切ってある。
Windows側をWiresharkLinux側をtcpdumpで見てみても何も通信されてないので、もしや?と思ってセキュリティソフトのファイアウォールをOFFにしたらつながった。
とりえあずVagrantであげた仮想サーバとの間のルールを追加したらちゃんとつながるようになった。

はまったことその3

Wildflyを使い、クライアントからアップロードしたファイルをFTPサーバに保存するというプログラムになっているわけだけれど、なぜかJSFの処理を終えたあとにWildflyERRORを吐く。
一時ファイルとして出力したファイルを消せない、とか言っている。

ERROR [io.undertow.request] (default task-4) UT005005: Cannot remove uploaded file C:\opt\wildfly-8.2.0.Final\standalone\tmp\chanko-ftp.war\undertow352795969556027635upload

何かな?と思っていたら、どうやファイルのInputStreamを閉じてないのが原因だった模様。try-with-resourceでInputStreamをcloseするようにしたら出なくなった。

その他雑感

実装はすごく簡単だったのだけれど、storeFileの処理部分で毎回2秒くらいかかる。ファイル自体は数KBで、ftpコマンドだと1秒かからない程度なのにも関わらず。
原因は探っていないけれど、今のところはそっとしておくことにする。