Que bom saber que o seu problema foi resolvido!

Avalados por :
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();
}
}
}
======================================================================
Que bom saber que o seu problema foi resolvido!
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
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 |
|
Novo |
|
Saudações
Eng Swee
contacto@primeinstitute.com
(+51) 1641 9379
(+57) 1489 6964
© 2025 Copyright. Todos los derechos reservados.
Desarrollado por Prime Institute