Hello,
We would be grateful if you could help us,
Our aim is to develop a method which retrieves an image stored in an external system, using a REST Operation
To upload the image we have the following code:
/// Operacion para gestionar el Registro imagen identidad digital en Tarjeta Sanitaria
Class Operaciones.REST.miSCS.miSCS Extends EnsLib.REST.Operation
{
Parameter INVOCATION = "Queue";
/// Subir la imagen del usuario
/// La documentación para crear este metodo es:
/// https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=GNET_http#GNET_http_post_multipart
/// https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=GNET_mime
Method SubirImagen(pRequest As Mensajes.Request.miSCS.SubirImagen, pResponse As Mensajes.Response.miSCS.SubirImagen) As %Library.Status
{
$$$LOGINFO("pRequest.imagen: "_pRequest.imagen) //Creamos Request y Response HTTP
Set httpRequest=##class(%Net.HttpRequest).%New()
set tResponse = ##class(%Net.HttpResponse).%New() // Generamos la parte que contiene a las demás partes, la "raiz", RootMIMEPart
Set RootMIMEPart=##class(%Net.MIMEPart).%New()
//Creamos la primera "subparte" con el expediente
Set ExpedienteMIMEPart=##class(%Net.MIMEPart).%New()
Set contentdisp="form-data; name=""expediente"""
Do ExpedienteMIMEPart.SetHeader("Content-Disposition",contentdisp)
Set ExpedienteMIMEPart.Body=pRequest.expediente
//Do ExpedienteMIMEPart.SetHeader("Content-Type","text/plain") ; esto no se envia en POSTMAN
//Asignamos la imagen
//Esto si funciona (la guarda como jpg y al descargarla se ve)
Set docStream=##class(%Stream.FileBinary).%New()
//Set sc=docStream.LinkToFile("C:\InterSystems\avatar prueba.jpg") // Esto no funciona (guarda el base64 directo, no el binario;
// es decir, guarda lo mismo que enviamos desde POSTMAN)
//set docStream = pRequest.imagen
//Si ponemos pRequest.imagen como string, enviamos el base64 por postman y decodificamos aqui a binario si
//guarda la imagen como jpg
set binary = $system.Encryption.Base64Decode(pRequest.imagen)
do docStream.Write(binary)
// Instanciamos la segunda "subparte" con la imagen
Set ImagenMIMEPart=##class(%Net.MIMEPart).%New()
// Incluimos la imagen, el docStream, en la subparte MIME
Do ImagenMIMEPart.BodySet(docStream)
// Cabeceras
Set ImagenMIMEPart.ContentType = "image/jpeg"
Do ImagenMIMEPart.SetHeader("Content-Disposition","form-data; name=""imagen""; filename=""imagen.jpg""")
// Insertamos las dos subpartes en la raiz
Do RootMIMEPart.Parts.Insert(ExpedienteMIMEPart)
Do RootMIMEPart.Parts.Insert(ImagenMIMEPart) // Creamos el MIME writer
Set writer=##class(%Net.MIMEWriter).%New() // Preparamos para enviar el mensaje MIME a la peticion HTTP
Set httpRequest=##class(%Net.HttpRequest).%New()
Set status=writer.OutputToStream(httpRequest.EntityBody)
if $$$ISERR(status) {do $SYSTEM.Status.DisplayError(status) Quit} // Escribimos el contenido del mensaje MIME en la peticion HTTP
Set status=writer.WriteMIMEBody(RootMIMEPart)
if $$$ISERR(status) {do $SYSTEM.Status.DisplayError(status) Quit} // Creamos la URL
set url = ##class(Util.TablasMaestras).getValorMaestra("MISCS.PARAMETRIZACIONES","url")
set path = ##class(Util.TablasMaestras).getValorMaestra("MISCS.PARAMETRIZACIONES","path")
set servicio = ##class(Util.TablasMaestras).getValorMaestra("MISCS.PARAMETRIZACIONES","servicio")
set recurso = ##class(Util.TablasMaestras).getValorMaestra("MISCS.PARAMETRIZACIONES","subirImagen") set URL = "http://"_url_path_servicio_recurso
$$$LOGINFO("URL: "_URL)
//Escribimos el tipo de contenido que enviamos en la raiz
Set httpRequest.ContentType="multipart/form-data; boundary="_RootMIMEPart.Boundary
$$$LOGINFO("> httpRequest.ContentType: "_httpRequest.ContentType) //Enviamos al sistema externo
set tSC=httpRequest.Post(URL,0)
$$$LOGINFO("tSC: "_tSC) //Lanzamos excepcion si hubo error
if $$$ISERR(tSC){
$$$ThrowOnError(tSC)
}
//Obtenemos respuesta
set tResponse = httpRequest.HttpResponse //Leemos respuesta
if (tResponse.Data.AtEnd = 0) {
set linea = tResponse.Data.Read()
$$$LOGINFO("Linea: "_linea)
} //Rellenamos response
set pResponse = ##class(Mensajes.Response.miSCS.SubirImagen).%New()
set pResponse.resultado = 1
set pResponse.informacion = linea
//Traducimos codigo del resultado, a descripcion
//set pResponse.informacion = ##class(Util.TablasMaestras).getValorMaestra("MISCS.CODIGOSTSI",linea) Quit pResponse
}
XData MessageMap
{
<MapItems>
<MapItem MessageType="Mensajes.Request.miSCS.SubirImagen">
<Method>SubirImagen</Method>
</MapItem>
</MapItems>
}