Avalados por :

Cómo decodificar y enviar archivos de imagen en un escenario Legacy -> PO -> ECC: Guía paso a paso

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 14 Vistas
0
Cargando...

Hola a todos,

Tengo un escenario desde Legacy-->PO-->ECC.

El sistema Legacy está enviando un archivo de imagen en formato codificado a PO y PO debe decodificarlo y enviar el archivo de imagen original a ECC.

¿Podrían ayudarme a entender cómo se puede lograr esto? Básicamente, necesito saber cómo se puede hacer la decodificación base64 en esta situación y enviar el archivo original después de decodificarlo al ECC de destino.

Saludos

Mahesh

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

¡Hola Mahesh!

La forma más directa es utilizar mapeo en Java (y funcionalidad en Java) para convertir tu cadena base64 a contenido binario y enviarlo al sistema receptor.

Otra opción podría ser utilizar un módulo de adaptador desarrollado por engswee.yeoh :

https://blogs.sap.com/2015/04/30/base64decodeconverter-base64-decoding-made-easy/

Saludos, Evgeniy.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Mahesh,

Puedes decodificar base64 en PO utilizando ya sea un Mapeo Java o UDF . Pero, ¿cuál es el propósito de decodificarlo en PO si necesitas enviarlo a ECC?

¿Estás planeando adjuntarlo a un documento SAP? En ese caso, el mejor enfoque sería enviar la cadena base64 a ECC a través de un proxy y decodificarla utilizando una lógica ABAP .

¡Saludos!

Isuru

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola a todos,

Estoy utilizando el siguiente código y está convirtiendo una cadena base64 en bytes y el mensaje también se está procesando correctamente, y el archivo con el adaptador de archivo del receptor se está enviando a la ubicación de destino, pero el archivo jpg de destino está en blanco.

A continuación se muestra el código que estoy utilizando: -

import java.io.InputStream; import java.io.OutputStream; import com.sap.aii.mapping.api.AbstractTransformation; import com.sap.aii.mapping.api.StreamTransformationException; import com.sap.aii.mapping.api.TransformationInput; import com.sap.aii.mapping.api.TransformationOutput; import javax.xml.bind.DatatypeConverter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; public class Decoder extends AbstractTransformation { @Override public void transform(TransformationInput in, TransformationOutput out) throws StreamTransformationException { String encodedString = null; Node encodedStringNode; try{ //Leer cargas útiles de entrada y salida. InputStream inputStream = in.getInputPayload().getInputStream(); OutputStream outputStream = out.getOutputPayload().getOutputStream(); //Crea una nueva instancia de la fábrica de árboles DOM DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //Crea una nueva instancia para obtener un documento DOM a partir de XML. DocumentBuilder builder = factory.newDocumentBuilder(); //Obtener un nuevo documento DOM a partir de XML de inputStream. Document doc = builder.parse(inputStream); //Obtener el nodo XML 'Base64EncodedString' del mensaje fuente. encodedStringNode = doc.getElementsByTagName("Base64Str").item(0); //Obtener el valor de cadena base64 del elemento XML 'Base64Str' del mensaje fuente. encodedString = encodedStringNode.getFirstChild().getNodeValue(); //Decodificar cadena base64 a texto. //byte[] decodedBytes = Base64.getDecoder().decode(encodedString); //String decodedString = new String(decodedBytes); byte[] bytesDecoded = DatatypeConverter.parseBase64Binary(encodedString); System.out.println("El valor decodificado es " + new String(bytesDecoded)); String strDecoded=new String(bytesDecoded); //Derivar mensaje XML de salida (destino). // outputStream.write(("<?xml version=\"1.0\" encoding=\"UTF-8\"?><ns1:Base64DecodedString xmlns:ns1=\"urn:Target_System:DecodedString\"><Base64DecodedString>"+decodedString+"</Base64DecodedString></ns1:Base64DecodedString>").getBytes()); outputStream.write(strDecoded.getBytes()); } catch (Exception exception) { getTrace().addDebugMessage(exception.getMessage()); throw new StreamTransformationException(exception.toString()); } } }

Adjunto está la carga útil que disparo para RWB para probar este escenario. testfile.txt bytecode-conversion-after-om-execution.jpg

Básicamente hay algún problema por el cual el archivo jpg de destino aparece en blanco.

¿Podrías ayudarme por favor si hay algo que necesite ser agregado al código para convertir esta cadena base64 en una imagen o cualquier otra cosa que me esté faltando aquí?

testfile.txt bytecode-conversion-after-om-execution.jpg
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

¡Hola a todos!

Ahora puedo convertir una cadena de imagen codificada en base64 a una imagen con el código a continuación. Inicialmente estaba intentando enviar los datos sin tener un padre node.So así que creé un nodo padre y luego agregué un campo hijo dentro de él como se muestra a continuación:-

<MT_Base64>

<row>

<Base64Str>

A continuación se muestra el código Java funcional:-

import java.io.InputStream; import java.io.OutputStream; import java.util.Base64; import javax.xml.bind.DatatypeConverter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.sap.aii.mapping.api.AbstractTransformation; import com.sap.aii.mapping.api.StreamTransformationException; import com.sap.aii.mapping.api.TransformationInput; import com.sap.aii.mapping.api.TransformationOutput; public class Decoder_V2 extends AbstractTransformation { @Override public void transform(TransformationInput in, TransformationOutput out) throws StreamTransformationException { String encodedString = null; try{ //Read input and output payloads. InputStream inputStream = in.getInputPayload().getInputStream(); OutputStream outputStream = out.getOutputPayload().getOutputStream(); //Creates new instance of DOM tree builder factory DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //Creates new instance to obtain DOM document from xml. DocumentBuilder builder = factory.newDocumentBuilder(); //Obtain new DOM document from inputStream xml. Document doc = builder.parse(inputStream); NodeList children = doc.getElementsByTagName("row"); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if(node.getNodeType() == Node.ELEMENT_NODE){ Element eElement = (Element) node; encodedString = eElement.getElementsByTagName("Base64Str").item(0).getTextContent(); } } //Decode base64 string to byte code. byte[] bytesDecoded = Base64.getDecoder().decode(encodedString); //Derive output(target) xml message. outputStream.write(bytesDecoded); } catch (Exception exception) { getTrace().addDebugMessage(exception.getMessage()); throw new StreamTransformationException(exception.toString()); } } }

También adjunto el código en un archivo txt.

decoder-v2.txt

decoder-v2.txt
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?