最近は、お客様と打ち合わせすることが多く、コーディングから遠ざかっている。
コーディングしないと、お客様への提案内容(特に技術的に可能かどうか)や見積もりのカンが鈍る。技術は日進月歩で、何もしないとお客様にまともな提案ができない。
今回のS3に画像をサムネイル表示する件も、あるお客様との打ち合わせがきっかけだ。
AWS S3に画像をアップロードしたときに、何でS3にこんな機能ないんだろう?って思った。
当初はscalaまで使ってコード書くつもりはなかったんです。
pythonのs3cmdと、アルバム作成するソフトを組み合わせれば、シェルを組めば実現できると思う。あとrubyを使ってもいいですね。
ただ、アルバム作成ソフトって、IE6に対応してないんです。JavaScriptがもうIE8以上しかダメ。お客様社内の端末はIE6なので、シンプルなHTMLでUIを作った方がいいと思った。(別にJavaScript凝ってもいいけど)
ってことで、早速深夜作業の待ち時間に作成してみた。
環境は以下の通り
クラス構成とか考えてません。main関数にベタ書きです。
ソースの説明です。
まず、AWS SDK JavaのAWS S3クライアントを作成する。
//create AmazonS3Client instance
val s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider);
val region = Region.getRegion(Regions.AP_NORTHEAST_1);
s3 setRegion region
次に、AWS S3のバケッド名を設定する。
(ここでは、バケット名をkzsampleとしている。)
//Get Objects in a bucket
val bucketName = "kzsample";
val objectListing = s3 listObjects(new ListObjectsRequest withBucketName bucketName)
S3のバケットからJPEG画像のパスをリストで取得する。
(scalaだとここが非常にシンプルなロジックでいいですよね。)
//Set Jpeg Files in jpegList
val jpegList = new java.util.ArrayList[String]
objectListing.getObjectSummaries().filter(p => p.getKey().endsWith(".jpg")).foreach(q => jpegList.add(q.getKey()))
VelocityテンプレートにS3から取得したパスを埋め込む。
テンプレートのパスは、templates/order.vmとしています。
//Velocity
Velocity.init()
val context = new VelocityContext()
context put("jpegList", jpegList)
val sw = new StringWriter()
Velocity getTemplate("templates/order.vm", "UTF-8") merge(context, sw)
テンプレートのサンプルは
こんな感じ。
VelocityでparseしたHTMLをS3にアップロードするオブジェクトに変換する。
val is = new StringInputStream(sw.toString())
val metadata = new ObjectMetadata()
metadata setContentEncoding "UTF-8"
metadata setContentType "text/html"
最後に公開権限をつけて、S3にアップロードする。
val is = new StringInputStream(sw.toString())
//Upload html file to S3
val putRequest = new PutObjectRequest(bucketName, "html/sample.html", is, metadata)
putRequest setCannedAcl CannedAccessControlList.PublicRead
s3 putObject putRequest
ということで、できたサンプルが
これです。
テンプレートのHTMLのデザインをもっと格好よくすれば、応用が効きますね。
HTML5とか....
参考までに、ソースは
こちら