Cómo guardar una imagen (BLOB) recibida por Web Service

rsz_xml_image 

Recientemente tuve que realizar la comunicación con una compañía a la cual se le enviaba cierta información y de respuesta supuestamente devolvía una imagen.

 

Ahora bien, para guardar la imagen (ya sea en disco o en un BLOB) no era tan sencillo como hacer un “Guardar como”. Lo que el webservice hacía era generar ese fichero, traducirlo a base64 y enviar los datos traducidos. ¿Qué quiere decir esto? Pues que como respuesta recibía una cadena de texto de 4.000 caracteres. No tan visual como esperaba…

¡Pero no perdamos la esperanza! Me sonaba ya de haber visto algo similar anteriormente en algún objeto de mi colección. Así que después de rebuscar y apoyarme en la red (una línea de aquí, una idea de allí…) lo que descubrí fue que el modo de hacerlo era, y de modo resumido, el siguiente:

Pasos

1.- Recuperar el código base64 del webservice (XML).unlock

2.- “Decodificarlo” a datos que pudiéramos entender. En este caso una Stream, que NAV, especialmente en sus últimas versiones, entiende las Streams muy bien.

3.- Guardar esa Stream en un campo BLOB del sistema.

4.- Y opcionalmente, extraer la información contenida a un fichero como tal. La única condición es que debemos saber el formato del fichero final. En mi caso tenía la opción cuando llamaba al webservice de elegir el formato de la imagen que quería recibir. Así que el mismo formato que yo especificaba, era en el que sabía que lo iba a recibir :-)

 

Pero bien, ¿realmente qué código necesitamos para realizar las acciones que acabamos de ver?

Explicación

1.- Recuperar el código base64

En mi caso para el envío de la información XML utilicé los siguientes automations. Una de ellas para la generación del XML a enviar y la otra variable para el envío del recién generado XML. No entraré en detalle en cuanto al propio envío de info se refiere.

Name DataType Subtype
XmlHttp Automation ‘Microsoft XML, v6.0′.XMLHTTP60
XmlDoc Automation ‘Microsoft XML, v6.0′.DOMDocument60

Lo que sí quiero decir es que después de enviar la información mediante la función

//Cargamos el documento
XmlDoc.load(XmlHttp.responseBody);

Podemos recuperar la respuesta usando:

XmlDoc.text (contiene la info de texto del XML de respuesta)

XmlDoc.xml (contiene todo el texto del fichero XML de respuesta, incluyendo jerarquía y etiquetas)

En mi caso solo quería el texto base64 y no el XML, así que usé XmlDoc.text.

 

2.- “Decodificarlo” a datos que podamos tratar

Bien, ya podemos recuperar la respuesta del webservice. Para traducirla y poderla tratar primero hay que convertirla.

Para ello primero declaramos estas variables:

Name DataType Subtype
BigText1 BigText  
MemoryStream DotNet System.IO.MemoryStream.’mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′
Bytes DotNet System.Array.’mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′
Convert DotNet System.Convert.’mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′

Y ponemos el siguiente código

BigText1.ADDTEXT(XmlDoc.text); // Guardamos en BigText1 el resultado del XML
Bytes := Convert.FromBase64String(BigText1); // Convertimos a String
MemoryStream := MemoryStream.MemoryStream(Bytes); // Guardamos en un Stream

 

3.- Guardar el stream en un BLOB

En este caso lo que haremos será crear una outstream para el campo donde queramos guardar el resultado del webservice y posteriormente escribir en esa stream. Una vez hecho guardamos la modificación del registro.

Record.BLOBField.CREATEOUTSTREAM(OStream);
MemoryStream.WriteTo(OStream);

Record.MODIFY;

 

4.- Exportar la información a un fichero

Llegados a este punto ya tenemos el fichero decodificado y guardado en el sistema. Ahora vamos a exportarlo para poderlo leer desde el aplicativo correcto.

Para ello podemos coger otra vez el mismo campo BLOB y crear un stream con su contenido (a diferencia del paso anterior, este es un InStream)

ToFile := ‘NombreFichero.png';
Record.BlobField.CREATEINSTREAM(IStream);
DOWNLOADFROMSTREAM(IStream,”,'<TEMP>’, ”,ToFile); // Descarga silenciosa

MESSAGE(‘El fichero está guardado aquí ‘+ToFile); // Muestra la ruta completa con el                                                                                            // fichero incluído

 

 

¡Y eso es todo! :-)









This entry was posted in NAV2013R2, Navision, Tips&Tricks, Web Services and tagged , , , , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*