Avalados por :

Como decodificar uma string Base64 de um arquivo XML e escrevê-la em uma imagem no FTP

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

Olá queridos amigos,

Estou tentando decodificar uma string Base64 presente em um arquivo XML fornecido e escrever o arquivo decodificado em formato de imagem na pasta FTP. Os canais de emissor e receptor são fictícios e utilizei o código de mapeamento Java fornecido neste link - http://scn.sap.com/thread/3475411 por Indrajit.

O problema é que as imagens no FTP de destino têm um tamanho de 0kb e não podem ser abertas com um editor. Parece que não são válidas. Tentei inserir um rastreamento no código para verificar se os conteúdos da tag 'ship:GraphicImage' estão sendo capturados ou não, esse valor da tag está sendo decodificado corretamente. O valor a ser decodificado é capturado corretamente, mas a saída não é válida. Não foram feitas configurações específicas de codificação-decodificação nos canais.

O JDK é 1.5, commons-codec-1.6.jar. Você pode sugerir qual pode ser o 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...

Que bom saber que o seu problema foi resolvido!

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

Muito obrigado Eng Swee !!!! Funcionou perfeitamente. Adicionei a parte de exceção e substituí o código DOM mencionado anteriormente e agora consigo ver o arquivo de imagem válido no ftp de destino. Não sou muito bom em Java, então não consegui descobrir como fazer isso antes.

Obrigado novamente!

Cumprimentos,

Rajesh Shinde

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

Olá Rajesh

Você mencionou que os dados decodificados em Base64 são para um arquivo de imagem. No entanto, você está utilizando processamento DOM que é para dados XML. Suspeito que uma exceção possa ser gerada durante o processamento DOM com os bytes de imagem decodificados, mas não está causando nenhum erro de alocação porque o tratamento de exceções simplesmente imprime o rastreamento da pilha.

Para confirmar isso, sugiro substituir a linha e.printStackTrace() pelo seguinte código. Se houver erros durante a alocação, isso faria com que a alocação falhasse.


throw new StreamTransformationException("Exceção: " + e.getMessage(), e);

Além disso, se os dados decodificados são os dados binários para o arquivo de imagem, você pode tentar enviar os bytes diretamente para o fluxo de saída. Substitua a lógica baseada em DOM pela seguinte lógica.

Antigo

  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);
Novo

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

Saudações

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?