2009年10月11日日曜日

groovletsでファイルアップロードする

groovletsでファイルアップロードするには、以下のようなフォームを最初に作成します。

form.groovy
println """
<html>
<head>
<title>Upload Form</title>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
</head>
<body>
<form method="POST" enctype="multipart/form-data"
action="upload.groovy">
<input type="file" name="file1" />
<input type="file" name="file2" />
<input type="submit" value="Upload!" />
</form>
</body>
</html>
"""

次にApache Commons FileUploadでアップロードしたファイルを受け取るgrooveletsを作成します。
// Groovelets
// http://groovy.codehaus.org/Groovlets
// Apache Commons FileUpload1.2.1
// http://commons.apache.org/downloads/download_fileupload.cgi
// Apache Commons IO
// http://commons.apache.org/downloads/download_io.cgi
import org.apache.commons.fileupload.disk.*
import org.apache.commons.fileupload.servlet.*
import org.apache.commons.fileupload.*

// アップロードディレクトリ
uploadDir = "c:\\share\\data\\"
dfif = new DiskFileItemFactory()
sfu = new ServletFileUpload(dfif)
sfu.setHeaderEncoding("UTF-8")

filenames = []
try
{
list = sfu.parseRequest(request)
for(fi in list){
if( !fi.isFormField() ){
filename = new File(fi.getName()).getName()
fi.write(new File(uploadDir + filename))
filenames.add(filename)
}
}
}
catch(FileUploadException fuex)
{
fuex.printStackTrace()
}
println """
<html>
<head>
<title>upload result</title>
</head>
<body>
uploaded file(s):${filenames}
</body>
</html>
"""


web.xmlは以下のように記述します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>GroovyServlet</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GroovyServlet</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>
</web-app>

Apache Commons FileUpload/IOのjarファイルをdownloadして、libディレクトリに
commons-fileupload-1.2.1.jarとcommons-io-1.4.jarをコピーします。

ビルドのためのgantスクリプト例
sourceDir = 'src'
buildDir = 'build'
stagingDir = 'stage'
deployDir = 'C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps'
groovyDir = 'C:/Program Files/Groovy/Groovy-1.6.3'
warFile = 'gupload.war'

ant.taskdef(name : 'groovyc', classname:'org.codehaus.groovy.ant.Groovyc')

target(compile:'compile java and groovy files.'){
mkdir(dir:buildDir)
javac(srcdir:sourceDir , destdir:buildDir)
groovyc(srcdir:sourceDir, destdir:buildDir)
}

target(war:'packaging'){
depends(compile)
mkdir(dir:"${stagingDir}/WEB-INF/classes")
copy(todir:stagingDir){
fileset(dir:"./", includes:"*.groovy")
}
copy(todir:"${stagingDir}/WEB-INF/lib"){
fileset(dir:"./lib", includes:"*.jar")
}
copy(todir:"${stagingDir}/WEB-INF/classes"){
fileset(dir:buildDir, includes:"*.class")
}
mkdir(dir:"${stagingDir}/WEB-INF/lib")
copy(todir:"${stagingDir}/WEB-INF/lib",
file:"${groovyDir}/lib/groovy-1.6.3.jar")
copy(todir:"${stagingDir}/WEB-INF/lib",
file:"${groovyDir}/lib/asm-2.2.3.jar")
copy(todir:"${stagingDir}/WEB-INF/lib",
file:"${groovyDir}/lib/antlr-2.7.7.jar")
copy(todir:"${stagingDir}/WEB-INF",
file:"./web.xml")

jar(destfile:warFile, basedir:stagingDir)
}

target(deploy:'copy war files to webapps'){
depends(war)
copy(todir:deployDir) {
fileset(dir:"./", includes:"*.war")
}
}

includeTargets << gant.targets.Clean
cleanPattern << '**/*~'
cleanDirectory << buildDir
cleanDirectory << stagingDir

setDefaultTarget(deploy)


動作環境
JDK6 Update16, groovy1.6.3, Apache Tomcat 5.5.28

関連情報
Groovelets
http://groovy.codehaus.org/Groovlets

Apache Commons FileUpload1.2.1のダウンロードページ
http://commons.apache.org/downloads/download_fileupload.cgi

Apache Commons IOのダウンロードページ
http://commons.apache.org/downloads/download_io.cgi

0 件のコメント:

コメントを投稿