猫とコード

化学メーカーでweb開発している猫大好きエンジニアの備忘録です。

Base64バイナリで受け取ったファイルをStreamで画像として保存する

長くなったのでVBS基本構文から分離しました

Base64バイナリで受け取ったファイルをStreamで画像として保存する

BASP21を使用

先頭でページの文字コードUTF-8にしておきます

<%@ CodePage=65001 %> 

BASP21でバイナリを読み込む

Set bobj = Server.CreateObject("basp21")
byteArray = Request.BinaryRead(Request.TotalBytes)
' 画像送信時にフォームのnameに「image」と名前を付けて送信しておく
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 'TypeBinary
stream.mode = 3 ' read write
stream.Open
stream.write(sarray)
stream.Position = 0
stream.Type = 2 ' TypeText
stream.Charset = "Windows-1252"
str = stream.ReadText ' binary to string
stream.close
set stream = nothing

base = Split(str,",") 

base(1)の本体部分をDOMDocumentのBase64Dataを使ってBase64デコードする.

' string Base64 decode
Set objXML = Server.CreateObject("MSXml2.DOMDocument")
Set objDocElem = objXML.createElement("Base64Data")
objDocElem.DataType = "bin.base64"
objDocElem.text = base(1) 'the base64-encoded string
imgdata = objDocElem.NodeTypedValue

imgdataに画像バイナリが格納されているのでStreanでpng画像としてサーバに保存します.

' 画像ファイルを保存
FileName = "D:\folder\picture.png"

set stream = server.CreateObject("ADODB.stream")
stream.type = 1 'TypeBinary
stream.mode = 3 ' read write
stream.Open
stream.write(imgdata)
stream.SaveToFile FileNa

今回はJPG・PNG問わずPNGで保存するような仕様にしました.送信時にJavaScriptCanvasに一度描画して画像縮小しているため,バイナリに拡張子の情報自体がないのだと思います.入力ファイルに拡張子が存在する場合,Streamでの画像保存時に元の拡張子を考慮する必要があるかもしれません.