今年の2月ごろ、Power Apps の研修でいつものようにモバイルアプリにカメラ機能を搭載してそこからPower Automate 経由で SharePoint に画像を保存するという演習をやろうとするとうまくいかないというトラブルが。
結果的には、一時的な不具合だったようで現在は修正されていますが、それだけでなく画像の取り扱いの仕様が少し変わったところもあるようなので改めて画像についての取り扱いを整理しておきたいと思います。
※あくまでも2025年7月現在の話であり、今後はまた変更されることもあると思いますのでご注意ください
Power Apps での画像の取り扱い
Power Apps では画像データは Base64形式で保持します。ですから、Power Automate に渡して画像を SharePoint や OneDrive(Business)にファイルとして保存する場合、Base64であることを考慮した処理が必要となります。
参考: そもそも Base64 とは? |
ここでBase64 (ベース ロクジュウヨン) とは何かというのを補足しておきましょう。 Base64 とはバイナリデータ(0か1かで表現されたデータ) を文字データに変換するエンコーディング方式の一つです。画像やファイルのようなバイナリデータをアルファベット(A-Z, a-z)、数字(0-9)、特殊文字(+,/) の64種類の文字で表現します。Base 64の “64” はこれに由来しています。便利な反面、テキスト化すると、元データより多少膨らむ(約1.37倍)点には注意が必要です。 この仕組みはもともとデータを文字形式に変換して電子メールなどのテキストベースのプロトコルで送信できるようにするために設計されました。 |
さて、Power Apps のカメラコントロールの Photo プロパティでは撮影した画像が直接 Base64でエンコードされます。ラベルなどに Photo プロパティを割り当てると値を簡単に確認できます。
ちなみに、Base64 には次の2つの形式があります。
- Data URI
- プレーン Base64
Data URI は接頭辞に "data:image/png;base64;iVBORw0..." のように実データ以外にファイルの種類などを示す文字列が追加されます。先ほどのカメラコントロールの Photo プロパティは Data URI です。
Power Automate にData URIを渡すと自動的にこの接頭辞は除去されプレーンな Base64 が渡されるようになっています。←これは実は、以前とは仕様が異なっているところ
ちなみに、画像コントロールや画像の追加コントロールに含まれるUploadedImageコントロールのImage プロパティはユーザーが画面に画像を追加すると Data URI ではなく appres://... という形式の値が格納されます。
コントロール | プロパティ | 値の例 |
---|---|---|
画像 | Image | appres://resources/P3293125 |
画像の追加 (UploadedImage1) | Image | appres://blobmanager/85db1f7390a34828b5d2f4f5e2cef0c3/1 |
画像の追加 (AddMediaButton1) | Media | appres://blobmanager/85db1f7390a34828b5d2f4f5e2cef0c3/1 |
カメラ | Photo / Stream | data:image/png;base64,iVBORw0…(中略)…K5CYII= |
appres:// で始まるのは Power Apps 内の内部リソース参照となっていて、「埋め込み画像」または「一時参照URI」などと呼ばれたりもします。各形式の意味と用途は次の通りです。
値の形式 | 意味 | 取得元コントロール例 | 特徴 |
---|---|---|---|
appres://resources/xxxxx... |
アプリに事前に埋め込まれた静的リソースへの参照 | 画像コントロールImage | 誰が見ても同じ画像 |
appres://blobmanager/xxxxx.... |
実行時にアップロードまたは選択された一時Blob参照 |
UploadedImage.Image AddMediaButton.Media |
一時的な画像、ユーザーごとに異なる |
と、ここまでは PC ブラウザー上の話で、Power Apps のモバイルアプリの場合は異なります。埋め込み画像以外のカメラコントロールや画像の追加コントロールの画像は格納先のパスが表示され、それぞれ "/SessionStorage/" 配下に格納されているのがわかります。
Power Automate との連携
Power Automate のクラウドフローに画像を渡す場合は、 Power Apps V2 コネクターのトリガーの引数として「ファイル」を追加しておきます。
Power Apps 側ではカメラコントロールで撮影した画像をプレビューするために画像コントロールのImageプロパティに割り当てることがよくあります。そのため、この場合の画像コントロールの Image プロパティにはData URIの Base 64 が格納されます。
ところで、画像の拡張子はカメラコントロールのPhotoプロパティから取得する場合は PNG形式ですが、その他の画像形式などもあり得ます。汎用的に拡張子を判定するためには次のように式を構成することも可能です。これをフローの呼び出し時などに使うといいでしょう。
//PCブラウザーかモバイル化の判定 Set(_IsMobile,If(Host.OSType="Android" || Host.OSType="iOS",true,false)); //Base64の先頭からmime typeを抽出する Set(_mimeType, //PCブラウザーの場合 If(!_IsMobile,Mid(Camera1.Photo,6,Find(";",Camera1.Photo)-6), //モバイルの場合 Right(Camera1.Photo,4) )); //ファイルの拡張子を決める Set(_fileExtension, If(_IsMobile, _mimeType, Switch(_mimeType, "image/jpeg", ".jpg", "image/png", ".png", "image/gif", ".gif", "image/bmp", ".bmp", // Default case (optional) Blank() ) ) );
さて、先述した通りPower Automateに送信するときにはData URI(data:image/xxx;base64,) のヘッダー部分を自動的に除去し、contentBytes にはプレーンBase64のみが格納されます。実際のフローの実行結果からもcontentBytesのフィールドで確認できます。
そのため、SharePoint にファイルを保存する場合は、SharePoint コネクターの「ファイルの作成」アクションのファイルコンテンツ プロパティでは base64ToBinary 関数を使い、次のように式を指定します。以上で SharePoint に画像をファイルとして保存することができます。
base64ToBinary(triggerBody()?['file']?['contentBytes'])
従来からの仕様変更の注意点
長らく(昨年の2024年のおそらく後半までは) Power Apps のカメラコントロールから Power Automate に渡した画像はData Uri 形式であったため、Power Automate 側で画像を受け取った後は dataUriToBinary() を使っていました。ですが、内部的な使用変更があったようでプレーンなBase64が渡されるようになっているため base64ToBinary() を使う必要があるので注意しましょう。
コメント