画像共有サイトなどを構築する場合、ファイルアップロード処理が必要になります。
sMashはファイルアップロード処理も容易に実装することができるのですが、ドキュメントにあまり詳しい記述がないようなので、簡単にまとめておきます。
Forumを検索すると、以下のスレッドがヒットします。
https://www.projectzero.org/forum/viewtopic.php?f=4&t=984&p=4125
どうやら、普通にmultipart/form-dataでPOSTすれば、勝手にmultipartがdecodeされ、ファイル実体への参照はグローバルコンテキスト(/request/files)に格納されるようです。
HTMLの方はこんな感じ。
[public/testUpload.gt]
<html>
<head>
<style type=”text/css”>
@import “<%= getRelativeUri(”/dijit/themes/tundra/tundra.css”) %>”;
</style>
<script type=”text/javascript”
src=”<%= getRelativeUri(”/dojo/dojo.js”) %>”
djConfig=”parseOnLoad: true”></script>
<script type=”text/javascript”>
dojo.require(”dijit.form.Form”);
dojo.require(”dijit.form.TextBox”);
dojo.require(”dijit.form.Button”);
</script>
</head>
<body class=”tundra”>
<form dojoType=”dijit.form.Form” id=”myForm” name=”myform1″
encType=”multipart/form-data” action=”testUpload.groovy” method=”POST” onSubmit=”">
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<button dojoType=”dijit.form.Button” type=”submit”>送信</button>
</form>
</body>
</html>
サーバー側のコードはこんな感じです。
[public/testUpload.groovy]
def onPOST() {
def files = request.files
def filelist = files['file1']
logger.INFO{ “Uploaded Files: ” + filelist.size().toString() }
logger.INFO{ “Information: ${filelist.toString()}” }
filelist.each{ file ->
def src = new File(file['path'])
new File(”${config.root[]}/tmp/${file['filename']}”).withOutputStream{ out ->
src.eachByte{ out.write(it) }
}
}
println “<h2>File Received</h2>”
}
グローバルコンテキスト /request/files には、「ファイル情報のMapの配列のMap」が格納されています。ちょっとわかりづらいですが、上の例で言うと
def filelist = files['file1']
のところで、Formで定義されているfile要素のうち、nameが’file1′のものを取り出しています。同じnameを持つfile要素が複数ある可能性があるので、Mapの配列になっているわけです。
あとは、それぞれのMapに格納されているファイル名やファイルパスを参照すればOKです。簡単でしょう?

Leave a Reply