このブログでCanvasについてよく扱っていたタイミングで、会社からCanvasを用いた編集ツールを作ることになりました。ただし、うちの会社で使っているサーバーは少し古めのIISで、現状サーバープログラミングはクラシックASPしか使えないようです。
ただ、Canvasで作った画像はサーバーに保存しなければいけないので、その方法を調べる必要がありました。Canvasの画像データ自体はBase64にして得られるものの、そのBase64の文字列をデコードしてファイルとして保存する必要があります。そこで見つけたのが、BASP21 DLLというASP上で扱えるコンポーネント。どうやら、Base64でファイルをデコードする機能もあるようです(わざわざ、Base64の文字列を入れたテキストファイルを作る必要があるようですが)。とりあえずやってみたものの、小さい画像ではうまくいきましたが、ちょっと大きくなるとダメでした(確か、200px*200pxぐらいだともうダメだったかと)。
正直ちょっと諦めかけて、LhaplusみたいなBase64デコード対応のソフトをWScript.Shellで操作するのがいいんじゃないか。なんて思っていた所、下記のサイトを発見。
ScrapCode/VBS/BASE64 – 備忘録
ASPはVBSで書かれているので、この方法でうまくいくかもしれません。なぜXMLを読み込んだり書き込んだりするためのMicrosoft.XMLDOMというオブジェクトでBase64のデコードができるのか謎なのですが、とりあえず試してみました。
以下、サンプルコード。
<% ' http://apis.jpn.ph/fswiki/wiki.cgi?page=ScrapCode/VBS/BASE64 Const adTypebinary = 1' バイナリデータ Const adTypeText = 2' テキストデータ Dim distFile distFile = "C:\inetpub\wwwroot\Canvas\test.png" '作成するファイル Dim stream, xmldom, node Set xmldom = Server.CreateObject("Microsoft.XMLDOM") Set node = xmldom.CreateElement("base64") node.DataType = "bin.base64" node.Text = Replace(Request.Form("acceptImage"), "data:image/png;base64,","") 'Base64の文字列を渡す Set stream = Server.CreateObject("ADODB.Stream") stream.Type = adTypeBinary stream.Open stream.write node.NodeTypedValue stream.saveToFile distFile, 2 'ファイルを作成 stream.Close Set stream = Nothing Set node = Nothing Set xmldom = Nothing %>
CanvasのHTMLは、前に作った、canvasを使ったお絵描き投稿システムを利用し、投稿先URLを、”image-accept.php”ではなく、”image-accept.asp”として試してみました。acceptImageというパラメータで、Canvasから得られたBase64 URLを渡すようにしています
結果、うまくいったようです。実際に使う時にはファイルパスとBase64の文字列を渡して、ファイルを作成する関数を作ったほうがいいかもしれませんね。
コメント