LoginSignup
3
4

More than 1 year has passed since last update.

Power Automateで "multipart/form-data" をPOSTする。Slack APIで画像をアップロード投稿。

Last updated at Posted at 2023-04-15

Power Automate Cookbookシリーズ

概要

Power AutomateでSlack APIに画像ファイルをアップロードしようとしたところ、
"multipart/form-data"のPOST送信でハマったので、成功例を公開いたします。
ポイントは画像ファイルに base64エンコード を加える方法です。

前提条件

  • クラウド版Power Automateで "multipart/form-data" をPOST送信する。
  • 組み込みの「HTTP」アクションを使用する。
  • 送信データは「テキスト」と「画像ファイル」。
  • POST送信先は Slack API の「files.upload」を使用する。
  • Slack APIで使用するtokenは取得済で、PostmanなどのツールからSlack APIへPOST送信が成功済みであることを前提とする。

参考資料

Slack API仕様 https://api.slack.com/methods/files.upload

アクションの定義

今回送信する画像ファイルはOneDriveに保存されているファイルを使用しますが、
他のシステムから取得して変数に保存した画像データなどを使用することも可能です。

HTTPアクションでPOSTメソッドを選択し、送信先のURLを設定します。
ヘッダー、クエリは空欄のままでOKですが、接続先APIの要求に応じて認証ヘッダーなどを設定してください。
今回SlackのトークンはPOST本文に設定していますので、ヘッダーは空欄です。

POST本文の定義

HTTPの本文にJSONで "multipart/form-data" の送信データを記述します。
"$multipart" 配下に送信する項目の "headers" と "body" のセットを繰り返し記述します。
"headers" の 「name=◯◯◯」に項目名(変数名)を設定し、"body" に値を設定します。

肝心の画像ファイルは4つ目に記載しています。
詳細は次のセクションで解説。

{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "headers": {
        "Content-Disposition": "form-data; name=token"
      },
      "body": "xoxb-1234567890-1234567890-ABCDEFGHIJKLMN"
    },
    {
      "headers": {
        "Content-Disposition": "form-data; name=channels"
      },
      "body": "YOUR_CHANNEL_ID"
    },
    {
      "headers": {
        "Content-Disposition": "form-data; name=filename"
      },
      "body": "filename.png"
    },
    {
      "headers": {
        "Content-Disposition": "form-data; name=file; filename=filename.png"
      },
      "body": {
        "$content-type": "image/png",
        "$content": @{concat(base64(outputs('ファイル_コンテンツの取得')?['body']))}
      }
    }
  ]
}

"multipart/form-data"の画像ファイル設定方法

今回はOneDriveの「ファイルを取得する」アクションで画像ファイルを用意しています。
この場合、動的コンテンツの記述は下記のようになります。
outputs('ファイル_コンテンツの取得')?['body']

ただし、画像などのバイナリファイルをPOST送信する場合は、Base64エンコードでテキストデータ化する必要があります。
Power Automateは関数によってBase64エンコードを行えますので、動的コンテンツをbase64関数で囲みます。
base64(outputs('ファイル_コンテンツの取得')?['body'])

しかし、作成したフローを保存すると、なぜかBase64関数が解除されてしまう不具合に悩まされました。
Power Automateのバグだと思いますが。
そこで、文字列を結合するconcat関数の中に入れてみると不具合を回避できました。
不本意ではありますが、下記のようになります。
concat(base64(outputs('ファイル_コンテンツの取得')?['body']))

これを "body" の "$content" に指定します。
ちなみにその上にある "$content-type" もデータの種類に合わせて適切に設定してください。
今回はPNGファイルのため "image/png" を指定しています。

    {
      "headers": {
        "Content-Disposition": "form-data; name=file; filename=filename.png"
      },
      "body": {
        "$content-type": "image/png",
        "$content": @{concat(base64(outputs('ファイル_コンテンツの取得')?['body']))}
      }
    }

これで、"multipart/form-data" でBase64エンコードされた画像ファイルをPOST送信できるようになるでしょう。
記載事項について、誤りなどお気づきの点がありましたらコメントにてお知らせください。
皆様のご健勝とご活躍をお祈り申し上げます。

今後もPower AutomateのTips、ノウハウを公開していきます。
お役に立ちましたら、ぜひ、いいね、ストックをいただけますと幸いです。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4