domingo, octubre 25, 2015

Desplegar campos BLOB en un Webpanel y Reporte PDF desde una cadena CODE64 resultado de un Servicio REST.


Un de las situaciones mas interesantes cuando se tiene un balanceador de carga de aplicaciones web basadas en java, es tener la posibilidad de transferir el archivo de imagenes en una cadena de datos CODE64, lo que facilita el proceso de trasnferenciad e informacion entre diferentes usuarios de las aplicaciones, adicional permite que se invoque un servicio web RESP/SOAP para que genera dicha imagen y luego pueda ser desplegada en la aplicacion muy agilmente, aqui citamos un ejemplo.

&MiBlob es de tipo BLOB.
&Imagen  es de tipo Image

&MiBlob.FromBase64String(&CadenaCode64)
&Imagen.FromURL(&MiBlob
)


Se desplega la variable &Imagen en un webpanel o en reporte PDF.

Como resultado de un servicio web se obtiene lo siguiente:

            &Url                        = "graficar"
            &HttpClient.Host      = 'localhost'
            &HttpClient.Port       = 8080       
            &HttpClient.BaseUrl  = '/graficador/rest/'

            &HttpClient.AddVariable('DATOSAGRAFICAR',    &XmlConDatos)
            &HttpClient.Execute("POST", &Url)
            &StatusCode            = &HttpClient.StatusCode
            &Resultado               = &HttpClient.ToString()

            &MiBlob.FromBase64String(&Resultado)
            &Imagen.FromURL(&MiBlob)




Articulo de Referencia:Articulo de Refrencia
 
A partir de la version X existen métodos de Blob para hacer el To y FromBase64. en la versión 90 no existen pero se pueden programar con un prograna externo.
 
Descripción Detallada 

El código nativo seria (**) y se invocaría de la siguiente forma en el código GX.

En .NET ser invoca así:


csharp [!&tst!] = context.FileToBase64( "prompt.gif");
csharp [!&txt1!] = context.FileFromBase64( [!&tst!], "gif" );
msg( &txt1, nowait)

En Java se invoca así (para usarlo en java hay que usar una gxlcassr actualizada, solicitarla a soporte):

java [!&txt!] = GXutil.blobToBase64( "prompt.gif");
java [!&txt1!] = GXutil.blobFromBase64( [!&txt!], "gif" );
msg( &txt1, nowait)


(**)
using System;
using System.IO;
public class Base64Utils
{
static public string ToBase64(string fileName)
{
try
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] bContent = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
return Convert.ToBase64String(bContent);
}
catch
{
return "";
}
}

static public void FromBase64( string fileName, string b64)
{
byte[] bContent = Convert.FromBase64String(b64);
try
{
FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
BinaryWriter bw = new BinaryWriter( fs);
bw.Write(bContent, 0, bContent.Length);
bw.Close();
fs.Close();
}
catch
{
}
}
}

Tambien se puede invocar directamente a la funcionalidad del framework, en cualquier version, algo como:

csharp byte[] array = System.Text.Encoding.ASCII.GetBytes([!&var!]);
csharp [!&base64cred!] = System.Convert.ToBase64String(array);
 

 

2 comentarios:

Mono dijo...

tengo una api que consume una imagen, viene encriptada, hay que desencriptar con una libreria cryptohash.dll, el resultado de esa encriptacion con algun metodo debo pasarlo a base 64 y recien ahi trabajarlo con una variable blob, podrias ayudarme?
mi mail es germanlaborda@gmail.com
por favor, muchisimas gracias!

Jcac dijo...

Actualmente trabajo aun en la versión 9, actualmente tengo un problema para poder incluir en un reporte PDF una imagen que me regresan de un web service en base64 la cual corresponde a un código QR, vi que en este post tienes dos soluciones una para JAVA y otra para CÓDIGO NATIVO, actualmente manejo JAVA pero no desconozco como poder insertar alguno de estos códigos en el código del reporte, podrías explicarme por favor? mi correo es jcecilio.aguilar@gmail.com,de ante mano gracias!!!