使用接收者ftp适配器将二进制文件放入ftp服务器的base64字符串

2020-09-09 03:05发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,老师;

我被搜索到有助于解决我问题的文章,但是我没有好的文章或文档对我有帮助。

因此,无论如何,源系统都试图将二进制文件(excel或image或pptx等)转换为DT中参数(字符串类型)之一的base64编码字符串,

PI(7.5)会将param1编码的base64字符串解码为以下解码源

然后如何使用接收器文件适配器使解码字符串将二进制文件发送到远程ftp服务器?

java映射也可能对我有帮助,欢迎Java映射或udf给我。

解码源如下:

Base64.Decoder解码器= Base64.getDecoder();

字节[]解码的字节数组= coder.decode(encodstring.getBytes(" UTF-8"));

谢谢

本杰明

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,老师;

我被搜索到有助于解决我问题的文章,但是我没有好的文章或文档对我有帮助。

因此,无论如何,源系统都试图将二进制文件(excel或image或pptx等)转换为DT中参数(字符串类型)之一的base64编码字符串,

PI(7.5)会将param1编码的base64字符串解码为以下解码源

然后如何使用接收器文件适配器使解码字符串将二进制文件发送到远程ftp服务器?

java映射也可能对我有帮助,欢迎Java映射或udf给我。

解码源如下:

Base64.Decoder解码器= Base64.getDecoder();

字节[]解码的字节数组= coder.decode(encodstring.getBytes(" UTF-8"));

谢谢

本杰明

付费偷看设置
发送
4条回答
落灬小鱼
1楼-- · 2020-09-09 03:28

嗨,本杰明!

使用Java映射,您可以直接将字节数组发送到输出流以获取二进制有效载荷作为结果:

 public void transform(TransformationInput in,TransformationOutput out  )引发StreamTransformationException {
//您的代码在这里
OutputStream os = out.getOutputPayload()。getOutputStream();
os.write(decodedByteArray);}

关于Evgeniy。

大简至美
2楼-- · 2020-09-09 03:30

你好,

您可以使用字节数组在Java映射中设置附件。

签出此线程以获取设置附件的代码

https://answers.sap.com/questions/12630857/sap-pipo-rest-to-file-download-file-from-url-which.html

关于vinat

callcenter油条
3楼-- · 2020-09-09 03:35

嗨,本杰明,
根据获取请求消息的方式,方法会有所不同。
您会多次获取数据类型吗? 在您的源有效载荷中? 像这样的东西-

 <记录>
  Excel1的base64数据
 用于Excel2的base64数据
 用于Excel3的base64数据
  

还是混合数据?

 <记录>
  Excel1的base64数据
  iamge2的base64数据
  ppt3的base64数据
  

还是一次只获取一种类型的数据?

 <记录>
  Excel1的base64数据
  

如果您以上述#3格式获取数据-

您可以尝试使用以下Java映射并在接收器文件通道中维护该参数-文件类型为Binary。

包com.sap.ConvertBase64toStream;
 导入java.io.InputStream;
 导入java.io.StringWriter;
 导入org.apache.commons.net.util.Base64;
 导入javax.xml.parsers.DocumentBuilderFactory;
 导入javax.xml.transform.OutputKeys;
 导入javax.xml.transform.Transformer;
 导入javax.xml.transform.TransformerException;
 导入javax.xml.transform.TransformerFactory;
 导入javax.xml.transform.dom.DOMSource;
 导入javax.xml.transform.stream.StreamResult;
 导入javax.xml.xpath.XPath;
 导入javax.xml.xpath.XPathConstants;
 导入javax.xml.xpath.XPathFactory;
 导入org.w3c.dom.Document;
 导入org.w3c.dom.NodeList;
 导入com.sap.aii.mapping.api.AbstractTransformation;
 导入com.sap.aii.mapping.api.StreamTransformationException;
 导入com.sap.aii.mapping.api.TransformationInput;
 导入com.sap.aii.mapping.api.TransformationOutput;

 公共类ConvertBase64toStream扩展AbstractTransformation
 {
 公共无效transform(TransformationInput arg0,TransformationOutput arg1)引发StreamTransformationException
    
     {
      getTrace()。addInfo("已调用JAVA映射");
      尝试
      {
             InputStream isData = arg0.getInputPayload()。getInputStream();
             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
             文档doc = dbf.newDocumentBuilder()。parse(isData);
             doc.setXmlStandalone(true);
             XPath xPath = XPathFactory.newInstance()。newXPath();
           /*我已经使用Java Xpath提取XML块,也可以从接口确定中将其作为参数传递
              *更好地参数化Xpath,如果源结构发生更改,则此代码将不起作用。
              *可以使用以下代码片段将Xpath表达式作为参数传递
              * String xpathV = TransformationInput.getInputParameters()。getString(" XPATH");
              * XPATH值应在接口确定中维护,并且必须在ESR的操作映射中绑定。
              *然后可以将以下语句修改为-
              * NodeList nodels =(NodeList)xPath.evaluate(xpathV,doc,XPathConstants.NODESET);
              */
             NodeList nodels =(NodeList)xPath.evaluate(" Records/base64Data",doc,XPathConstants.NODESET);
             字符串b64Str = nodeListToString(nodels);//b64Str是数据类型的base64字符串
             字节[] b64bytes = Base64.decodeBase64(b64Str);
             尝试
             {
             arg1.getOutputPayload()。getOutputStream()。write(b64bytes);
             }
             catch(异常e)
              {
                 e.toString();
              }
            
         
      }
      捕获(异常e)
      {
          e.printStackTrace();
      }
    
     }

 私有静态字符串nodeListToString(NodeList nodels)抛出TransformerException
 {
  DOMSource source =新的DOMSource();
  StringWriter writer = new StringWriter();
  StreamResult结果=新的StreamResult(writer);
  变压器变压器= TransformerFactory.newInstance()。newTransformer();
  Transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"是");
  对于(int i = 0; i 
 
但是,即使每次一次只获得一个base64字符串,如果每次base64的类型都不相同,也会出现问题。 例如-pdf,ppt,图像等,在这种情况下,需要根据您收到的文件类型动态更改文件名。 在这种情况下,如果您可以在数据类型中添加另一个字段,例如-filetype或filename(最好具有此名称),则效果会更好。 来源看起来像这样-

 <记录>
  ABC.xls 
  Excel1的base64数据
  

您可以向Java映射中添加一些内容-

添加以下导入-

导入com.sap.aii.mapping.api.DynamicConfiguration;
导入com.sap.aii.mapping.api.DynamicConfigurationKey;

和下面的代码段,此代码段位于现有代码字节中[] b64bytes = Base64.decodeBase64(b64Str);

添加以下代码-

 DynamicConfiguration dynConfig = arg0.getDynamicConfiguration();
             DynamicConfigurationKey key1 = DynamicConfigurationKey.create(" http:/" +"/img/sap.com/xi/XI/System/File","FileName");
             NodeList fnode =(NodeList)xPath.evaluate(" Records/FileName",doc,XPathConstants.NODESET);
             字符串fname = nodeListToString(fnode);
             dynConfig.put(key1,fname); 

如果您不想使用Java代码添加动态文件名,则可以使用前面的代码并使用变量替换来填充文件名。

在Java映射中,从

添加外部Jar文件-commons-net-3.6.jar。

https://commons.apache.org/proper/commons-net/ download_net.cgi

谢谢

Sugata

SAP小黑
4楼-- · 2020-09-09 03:21

Sugata Bagchi Majumder,

我尝试使用上述格式#3进行测试,但是我没有使用DynamicConfiguration进行简单测试。

String b64Str = nodeListToString(nodels);//b64Str是数据类型的base64字符串

byte [] b64bytes = Base64.decodeBase64(b64Str); arg1.getOutputPayload()。getOutputStream()。write(b64bytes);

aaaa.pptx是通过文件适配器在远程ftp服务器中以二进制模式创建的,其大小与原始pptx文件相同。

但无法打开它。 也用于Java映射,但存在相同的问题。

byte [] b64bytes = Base64.decodeBase64(b64Str.getBytes(" UTF-8"));

我必须在配置接收器文件适配器中做些什么吗?

谢谢

本杰明

一周热门 更多>