I ran all over the Net (via Google and Google Groups) this evening trying to figure out the answer to what I thought was a simple question. Everywhere I turned I found pieces of what I wanted to do...clues...but not even close to the whole solution (isn't that always the way?). So, when I DID figure it out (for better or worse) I wanted to put the solution out in the world, lest I forget it, so if some poor schmoe needs to go looking for it him/herself.
I've got a very constrained environment in this instance, with ASP (not ASP.NET) on the client side, calling a Java WebService that includes a Base64 encoded image. I wanted to get the image out of the soap envelope WITHOUT touching the disk. The data in the image is very sensitive and it can't be saved.
I know this is easy, and done basically automatically with serialization in ASP.NET...heck, most SOAP stacks handle this kind of stuff for you...I guess I just made it harder than it needed to be in Classic ASP. I found all sorts of interesting stuff, including an online Base64 decoder, and one guy who actually wrote a BASE64 Decoder entirely in VBScript (which was, not surprisingly more effort than I was willing to handle today)!
The Proof of Concept result is this snippet of ASP/VBScript code...sigh...these things are so obvious AFTER they've been written!
Set mDoc = Server.CreateObject("MSXML2.DOMDocument")
mDoc.async = false
mDoc.ValidateOnParse = false
'NOTE: The REAL xml file will come from inside our SOAP Envelope when it comes over from the SOAP/REST call to the Java WS
mDoc.Load Server.MapPath(".") + "\\sample.xml"
Set oNode = m_Doc.selectSingleNode("/Envelope/Body/ImgQryRs/imgBin64")
'NOTE: I had to force the dataType to bin.base64 since there wasn't yet an XSD available to declare it was so.
oNode.dataType = "bin.base64"
Interesting things about this:
- MSXML is smarter than I thought when using nodeTypedValue (accessing the property when the dataType is a bin.base64 causes an implicit conversion to a byte array)
- Response.BinaryWrite in ASP is pretty darn useful, even in this typeless varient-y world of Classic ASP
- When there's no XSD available (duh!) then nodeTypedValue doesn't work well! :)