¡Qué bueno saber que se resolvió tu problema!
Avalados por :
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();
}
}
}
======================================================================
¡Qué bueno saber que se resolvió tu problema!
¡¡¡¡¡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
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 |
|
Nuevo |
|
Saludos
Eng Swee
contacto@primeinstitute.com
(+51) 1641 9379
(+57) 1489 6964
© 2024 Copyright. Todos los derechos reservados.
Desarrollado por Prime Institute