在Logic App中处理(读取)Base64编码的文件,并发布到端点

时间:2019-03-05 16:38:45

标签: json azure-logic-apps microsoft-flow

我有一个Logic App,它可以从SharePoint(.xlsx)获取内容,并将正文发布到端点进行处理。现在我看到的内容是一个base64编码的文件,我想要做的就是按原样发布此数据。

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

  

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

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

def func(x):
    d = eval(x['c'])
    x['a'] = d['a']
    x['b'] = d['b']
    return x


df = df.apply(lambda x : func(x), axis=1)

也尝试过此表达式

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

但是我得到了另一个错误

  

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

我想要实现的过程很简单,实际上我想将Json或base64Encoded字符串的内容发布到终点。

3 个答案:

答案 0 :(得分:1)

能否将您的邮递员请求发给我,将其保存在收集中,然后导出为文件。 我认为您在邮递员中可以做的事情也可以在逻辑应用程序中完成。 或将您的代码发送给我,我可以对其进行修改。确保您将post作为正文,并且与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); }
               });

答案 1 :(得分:1)

查看您的陈述后:

  

Logic App从SharePoint(.xlsx)获取内容,并发布   主体到端点进行处理。现在我看到的内容是   base64编码的文件

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

1)检查“内容类型”标头是否正确放置,如有可能,将其更改为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 :(得分:0)

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

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

第二个解决方案,将您的文件更改为直接可读的文件(例如.txt文件),通过这种方式,我尝试了一下,可以解析Json。

enter image description here