Avalados por :

Cómo decodificar una cadena Base64 de un archivo XML y escribirlo en una imagen en FTP

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

Hola queridos amigos,

Estoy intentando decodificar una cadena Base64 presente en un archivo XML dado y escribir el archivo decodificado en formato de imagen en la carpeta FTP. Los canales de emisor y receptor son ficticios y he utilizado el código de mapeo de Java dado en este enlace - http://scn.sap.com/thread/3475411 por Indrajit.

El problema es que las imágenes en el FTP de destino tienen un tamaño de 0kb y no se pueden abrir con un editor. Parece que no son válidas. Intenté insertar un rastreo en el código para verificar si los contenidos de la etiqueta 'ship:GraphicImage' están siendo recogidos o no, este valor de etiqueta se está decodificando correctamente. El valor a decodificar se recoge correctamente pero la salida no es válida. No se han realizado configuraciones específicas de codificación-decodificación en los canales.

El JDK es 1.5, commons-codec-1.6.jar. ¿Puedes sugerir cuál puede ser el problema?

==========================================

package com.sap.base64toImage;

import java.io.ByteArrayInputStream;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.apache.commons.codec.binary.Base64;

import org.w3c.dom.Document;

import org.w3c.dom.NodeList;

import com.sap.aii.mapping.api.AbstractTrace;

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 Xmltoimagebase64 extends AbstractTransformation {

public void transform(TransformationInput arg0, TransformationOutput arg1)

throws StreamTransformationException {

AbstractTrace trace = getTrace();

try {

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document docOld = builder.parse(arg0.getInputPayload().getInputStream());

NodeList details = docOld.getElementsByTagName("ship:GraphicImage");

String data = details.item(0).getChildNodes().item(0).getNodeValue();

trace.addInfo("data value is -----" + data);

byte[] decodedBytes = Base64.decodeBase64(data.getBytes());

trace.addInfo("decoded base64 byte array is ------" + decodedBytes);

Document docNew = builder.parse(new ByteArrayInputStream(decodedBytes));

TransformerFactory transformerFactory = TransformerFactory.newInstance();

Transformer transformer = transformerFactory.newTransformer();

DOMSource source = new DOMSource(docNew);

StreamResult result = new StreamResult(arg1.getOutputPayload().getOutputStream());

transformer.transform(source, result);

} catch (Exception e) {

e.printStackTrace();

}

}

}

======================================================================

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

3 Respuestas

0
Cargando...

¡Qué bueno saber que se resolvió tu problema!

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

¡¡¡¡¡Muchas gracias Eng Swee !!!! funcionó a la perfección.. Añadí la parte de excepción y reemplacé el código DOM mencionado anteriormente y ahora puedo ver el archivo de imagen válido en el ftp de destino. No soy muy bueno en Java, así que no pude descifrar cómo hacer esto antes.

¡Gracias de nuevo!

Saludos,

Rajesh Shinde

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

Hola Rajesh

Mencionaste que los datos Base64 decodificados son para un archivo de imagen. Sin embargo, estás utilizando procesamiento DOM que es para datos XML. Sospecho que podría generarse una excepción durante el procesamiento DOM con los bytes de imagen decodificados, pero no está causando ningún error de asignación porque el manejo de excepciones simplemente imprime la traza de pila.

Para confirmar esto, te sugiero reemplazar la línea e.printStackTrace() con el siguiente código. Si hay errores durante la asignación, esto haría que la asignación falle.


throw new StreamTransformationException("Excepción: " + e.getMessage(), e);

Además, si los datos decodificados son los datos binarios para el archivo de imagen, puedes intentar enviar los bytes directamente al flujo de salida. Reemplaza la lógica basada en DOM con la siguiente lógica.

Antiguo

  Document docNew = builder.parse(new ByteArrayInputStream(decodedBytes));
  TransformerFactory transformerFactory = TransformerFactory.newInstance();
  Transformer transformer = transformerFactory.newTransformer();
  DOMSource source = new DOMSource(docNew);
  StreamResult result = new StreamResult(arg1.getOutputPayload().getOutputStream());
  transformer.transform(source, result);
Nuevo

OutputStream os = arg1.getOutputPayload().getOutputStream();
os.write(decodedBytes);

Saludos

Eng Swee

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?