長くなったのでVBS基本構文から分離しました
Base64バイナリで受け取ったファイルをStreamで画像として保存する
BASP21を使用
先頭でページの文字コードをUTF-8にしておきます
<%@ CodePage=65001 %>
BASP21でバイナリを読み込む
Set bobj = Server.CreateObject("basp21")
byteArray = Request.BinaryRead(Request.TotalBytes)
sarray = bobj.FormBinary(byteArray,"image")
読み込んだバイナリをStremでWindows-1252(utf-8のWin版かな?)文字列に変換し,変数「str」に保存.
「image,base64の画像本体」となっているのでカンマでSplitしてbaseに保存.
このとき,<%@ CodePage=65001 %>
でASPファイルを明示的に文字コードをUTF-8の宣言しておかないと文字化けしてうまくいかなかったです.
dim stream : set stream = server.CreateObject("ADODB.stream")
stream.type = 1
stream.mode = 3
stream.Open
stream.write(sarray)
stream.Position = 0
stream.Type = 2
stream.Charset = "Windows-1252"
str = stream.ReadText
stream.close
set stream = nothing
base = Split(str,",")
base(1)の本体部分をDOMDocumentのBase64Dataを使ってBase64デコードする.
Set objXML = Server.CreateObject("MSXml2.DOMDocument")
Set objDocElem = objXML.createElement("Base64Data")
objDocElem.DataType = "bin.base64"
objDocElem.text = base(1)
imgdata = objDocElem.NodeTypedValue
imgdataに画像バイナリが格納されているのでStreanでpng画像としてサーバに保存します.
FileName = "D:\folder\picture.png"
set stream = server.CreateObject("ADODB.stream")
stream.type = 1
stream.mode = 3
stream.Open
stream.write(imgdata)
stream.SaveToFile FileNa
今回はJPG・PNG問わずPNGで保存するような仕様にしました.送信時にJavaScriptでCanvasに一度描画して画像縮小しているため,バイナリに拡張子の情報自体がないのだと思います.入力ファイルに拡張子が存在する場合,Streamでの画像保存時に元の拡張子を考慮する必要があるかもしれません.