No Programming, No Life

プログラミング関連の話題や雑記

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()

としています。

*1:Groovy Version: 1.6.3 JVM: 1.6.0_13

*2:適当じゃなくてちゃんと英文読みなさい。はい、ごめんなさい。