GroovyでFTP by grape
Groovyで(というかJavaで)動的に作った文字列をFTPでアップロードしてWebページをゴリゴリ更新できないかな〜と思い、ライブラリを探してみたらJakartaのcommons-netに行き着きました。
ちょうどその頃、twitterでゲンゾウさんにGroovy使ってるんならgrapeがいいよとつぶやいていただいたので、いい機会だったので試してみました。
grapeのことがよく分かっていなかったので、とりあえずゲンゾウさんのこの記事と、さらにそのリンク先の記事を参考にさせていただきました。
使用するライブラリ
Commons Net
http://www.mvnrepository.com/artifact/commons-net/commons-net
で、出来たのが以下のような感じ*1
import static java.lang.System.* import org.apache.commons.net.ftp.FTP import org.apache.commons.net.ftp.FTPClient import org.apache.commons.net.ftp.FTPReply // grape @Grab(group = 'commons-net', module='commons-net', version='latest.integration') class Dummy{} def host = 'ホスト名' def loginName = 'ユーザ名' def password = 'パスワード' def dirName = '/' def fileName = 'index.html' def htmlText = '<HTML><HEAD><TITLE>テストですよん</TITLE></HEAD><BODY>ぼでぃ</BODY></HTML>' def ftpClient = new FTPClient() // コネクト ftpClient.connect(host, CTRL_PORT) if (!FTPReply.isPositiveCompletion(ftpClient.replyCode)) { println 'connection failed' exit(1) // 異常終了 } // ログイン if (!ftpClient.login(loginName, password)) { println 'login failed' exit(1) // 異常終了 } // Passiveモードを設定します ftpClient.enterLocalPassiveMode() // ファイル転送モード設定 ftpClient.fileType = FTP.ASCII_FILE_TYPE // ファイル送信 def is = new ByteArrayInputStream(htmlText.bytes) // クライアント側 ftpClient.storeFile("${dirName}${fileName}", is) // サーバー側 is.close() println 'FTP PUT COMPLETED'
考察
@Grabの部分
// grape @Grab(group = 'commons-net', module='commons-net', version='latest.integration') class Dummy{}
とやっているため、自動で最新のcommons-netのjarを取得してきてくれます。便利ですね。
groupとかmoduleとかは
POM Dependency
commons-net
commons-net
20030805.205232
を参考に適当に入れてます…。*2
接続先のサーバがパッシブモードをご所望だったので、
// Passiveモードを設定します
ftpClient.enterLocalPassiveMode()
としています。