处理(读取)逻辑应用程序中的 Base64 编码文件,并发布到端点

Posted

技术标签:

【中文标题】处理(读取)逻辑应用程序中的 Base64 编码文件,并发布到端点【英文标题】:Handling (read) of Base64 encoded files in a Logic App, and post to endpoint 【发布时间】:2019-07-27 04:50:51 【问题描述】:

我有一个逻辑应用程序,它从 SharePoint (.xlsx) 获取内容并将正文发布到端点以进行处理。现在我看到的内容是一个base64编码的文件,我想做的是按原样发布这些数据。

当我尝试使用邮递员发布它时,它被成功接受,但是当它从我得到的逻辑应用程序发布时

错误请求。 Http 请求失败:内容不是有效的 JSON。

但我可以看到要发送的正文是类型,这是一个有效的 Json


  "$content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  "$content": "AA....VeryLong...B1241BACDFA=="

也试过这个表达方式

decodeBase64(triggerBody()?[body('getFile')])

但我得到一个不同的错误

无效的模板。无法在“1”行和“2565”列的操作“HTTP”输入中处理模板语言表达式:“模板语言表达式 'decodeBase64(triggerBody()?[body('getFile')])' 无法评估,因为属性' "$content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "$content": "UEsDBBQABgAIAAAAIQDuooLHjAEAAJkGAAATAAgCW0Nvb...

我想要实现的很简单,我真的想将 Json 原样或 base64Encoded 字符串的内容发布到我的终点。

【问题讨论】:

【参考方案1】:

看了你的陈述后:

逻辑应用从 SharePoint (.xlsx) 获取内容并发布 正文到端点以进行处理。现在我看到的内容是 base64 编码文件

我假设您的端点仍在寻找内容类型 -vnd.openxmlformats-officedocument.spreadsheetml.sheet 但您传递的是 Base64 字符串

1) 检查您的“content-type”标头是否放置正确,如果可能,将其更改为 application/json 2) 确保正确处理 base64 字符串。

在我的例子中,我使用 javascript 从图像文件中提取了 base64 字符串。我在 base64 字符串的开头有特殊键,例如 ''data:image/png;base64','ACTUAL BASE 64 STRING...' 所以我删除了特殊的带有一些正则表达式的实际 base64 字符串之前的键。 此示例 Json 请求可能有助于附加 base64 内容

确保您使用 JSON.stringify

将您的请求转换为 JSON
          //var finalString = srcData.replace('data:image/png;base64,','');  
          var finalString = srcData.replace(/^,+?(\,)/, ''); 
          finalString = srcData.substring(srcData.indexOf(',')+1, srcData.length);
          var data = JSON.stringify(
            "requests": [
                
                  "image": 
                    "content": finalString
                  ,
                  "features": 
                  [
                    
                      "type": "DOCUMENT_TEXT_DETECTION",
                      "maxResults": 1
                    
                  ]
              
            ]
          );

这是我使用的 XMLHttpRequest:

var xhr = new XMLHttpRequest();
        xhr.withCredentials = true;
        xhr.addEventListener("readystatechange", function () 
          if (this.readyState === 4) 
            console.log(this.responseText);
            var obj = JSON.parse(this.responseText);
            try 
            
              //do something
            catch(err) 
            
            //do something
            
          

        );
        try 
        xhr.open("POST", "https://vision.googleapis.com/v1/images:annotate?key=blablabla");
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.setRequestHeader("cache-control", "no-cache");
        xhr.setRequestHeader("Postman-Token", "111111111");

        xhr.send(data);
        
        catch(err) 
            //do something
        

【讨论】:

【参考方案2】:

您能否将您的邮递员请求发送给我,将其保存在收集中,然后导出为文件。 我认为您在邮递员中可以做的事情也可以在逻辑应用程序中完成。 或者把你的代码发给我,我可以修改它。确保你有post作为body,它与web api级别的post参数匹配。

 var Webrequestdata = 
     "webserviceurl":  "http://examplecom/u/b/b/e.ee.msg",
   "username":  "123"
;



 $.ajax(
                   cache: false,
                   type: "POST",
                   url: 'http://example.com/res/api/Outlookapi',
                   data: JSON.stringify(Webrequestdata),
                   contentType: "application/json",
                   success: function (result) 
                       console.log("email sent  successfully");
                   ,
                   error: function (response)  alert('Error: ' + response.responseText); 
               );

【讨论】:

【参考方案3】:

如果你用base64解码内容你会发现内容是乱码。这是因为内容是 ooxml 格式,然后使用 base64 编码。而在逻辑应用程序中,您无法解码 ooxml。

第一个解决方案,您可以使用 Azure Function 编写一个读取文档然后返回内容的方法。然后在逻辑应用中调用函数来获取内容。

第二种方案,把你的文件改成直接可读的文件(比如.txt文件),这种方式我试过了,你可以解析Json。

【讨论】:

以上是关于处理(读取)逻辑应用程序中的 Base64 编码文件,并发布到端点的主要内容,如果未能解决你的问题,请参考以下文章

彻底弄懂Base64编码原理

Base64 Nodejs 中的读取文件

一篇文章彻底弄懂Base64编码原理

从文件中读取数据并编码成base64 java

针对base64编码和URIEncode的一点研究

Python中的Base64编码的加密与解密