Fala pessoal! Hoje trago uma dica bacana para vocês, para quem usa o Power Automate como um ponto de acesso para receber dados através de requisições HTTP. Muitas vezes o consumidor do power automate acaba que não consegue mandar um objeto do tipo JSON e manda no formato form-data, dificultando a leitura das informações dentro do fluxo de nuvem.

O form-data é um formato de chave e valor muito utilizado para enviar informações de formulários dos sites. Mas além de dados de um formulários também utilizam para envio de arquivos também.

Porém no Power Automate não traz nenhum funcionalidade para obter as informações. Mas não é o fim do mundo isso! Vou mostrar aqui nesse post como obter os arquivos. ?

Primeiramente quando olhamos as propriedades que temos no Power Automate quando não definimos o objeto JSON, é somente o body.

Mesmo assim, isso não nos impede de ler os dados. Quando executamos um request para o fluxo de nuvem enviando o formato form-data, nos logs da execução podemos identificar como o Power Automate faz a leitura das informações.

{
  "$content-type": "multipart/form-data; boundary=----WebKitFormBoundaryzDBhGsGdNKHuQJ04",
  "$content": "LS0tLS0tV2ViS2l0Rm9ybUJvdW5kYX....",
  "$multipart": [
    {
      "headers": {
        "Content-Disposition": "form-data; name=\"arquivos\"; filename=\"Power Automate Copilot_ Product and features deep-dive - October 2024.ics\"",
        "Content-Type": "text/calendar",
        "Content-Length": "5159"
      },
      "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN\r\n\r\nBEGIN:VEVENT\r\nDTSTAMP:20241001T22739Z\r\nUID:1539\r\nDTSTART:20241007T130000\r\nDTEND:20241007T140000\r\nSUMMARY:Power Automate Copilot: Product and features deep-dive - October 2024\r\n\r\nX-ALT-DESC;FMTTYPE=text/html:<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><base href=\"https://microsoft.sharepoint.com\" /></head><body><p>Private Event: This Product Group Interaction is available only to specific NDA compliant MVPs or RDs, by private invitation only. Event participation is available only to:</p><p>·       Invited Award Category(s): Business Applications</p><p>·       Invited Technology Area(s):.."
    },
    {
      "headers": {
        "Content-Disposition": "form-data; name=\"arquivos\"; filename=\"Dynamics 365 Project Operations – Strategy, Philosophy and Roadmap Part 1 -Option 1.ics\"",
        "Content-Type": "text/calendar",
        "Content-Length": "6172"
      },
      "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN\r\n\r\nBEGIN:VEVENT\r\nDTSTAMP:20241001T22719Z\r\nUID:1534\r\nDTSTART:20241003T130000\r\nDTEND:20241003T140000\r\nSUMMARY:Dynamics 365 Project Operations – Strategy, Philosophy and Roadmap Part 1 -Option 1\r\n\r\nX-ALT-DESC;FMTTYPE=text/html:<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><base href=\"https://microsoft.sharepoint.com\" /></head><body><p>This event will be held online via Microsoft Teams, please use the option link below to join.</p><p>Option 1: Thursday, October...."
    }
  ]
}

Analisando a estrutura JSON formada, podemos observar que temos uma propriedade “$multipart” do tipo array, que apresenta a listagem dos arquivos que foram enviados. Com base nessa análise já podemos obter os arquivos para salvar em um Dataverse ou Sharepoint.

Para obter os arquivos precisamos então adicionar um action de compor (compose) e aplicar a seguinte fórmula:

//Obtendo a propriedade $multipart do corpo da requisição do fluxo
triggerBody()?['$multipart']

Agora que temos a listagem do arquivos vamos utilizar a action ‘Aplicar a cada..” para que possamos percorrer em cada arquivo. Vamos colocar como parâmetro a ação que criamos anteriormente

Vamos agora pegar o conteúdo do arquivo e o nome dele. Para isso, vamos adicionar mais duas ações de compor:

A primeira será para o nome do arquivo, onde utilizaremos a seguinte fórmula para obter o nome com a extensão:

replace(split(split(item()?['headers/Content-Disposition'], 'filename="')[1], '"')[0], '\"', '')

Agora vamos adicionar a segunda que é para obter o conteúdo do arquivo, ou seja, o binário. E vamos utilizar a seguinte expressão na action:

item()?['body']

Agora para mostrar o arquivo sendo salvo em algum lugar vou criar o arquivo dentro de uma pasta no Sharepoint, utilizando a saída das ações de compor:

A estrutura final do fluxo de nuvem ficou assim:

E agora quando abrimos o Sharepoint e verificamos na pasta, os arquivos salvos com sucesso.

Pronto! Agora você esta apto para ler arquivos de requisições do tipo form-data nos seus fluxo de nuvem no Power Automate.

Espero que tenham gostado, e até a próximo post!

Leave a Reply

Your email address will not be published. Required fields are marked *

Protected by WP Anti Spam