少し前にPower AppsでExcelファイルをアップロードしてDataverseにデータ登録を行うようなアプリとフローを紹介しました。
今回は少し応用して、複数ファイルを一括でフローに渡すようなケースを考えます。
説明の都合上、ファイル→Base64文字列への変換ボタンと、フローの実行は分けています。
画面には添付ファイルコントロールとギャラリーコントロールを2つ、そしてデータ変換用ボタンを追加しています。
真ん中のギャラリーは変換の都合で追加しているだけなので、非表示でも問題ありませんし、右側のギャラリーは結果確認用なのでなくてもよいです。
ポイントは3つ
- ギャラリーコントロールのItems プロパティ = 添付ファイルコントロールのAttachments
- ギャラリーコントロールには画像コントロールを入れる
- Base64への変換はJSON関数とAddColumnsを利用
です。
1. ギャラリーのItems プロパティ
変換用ギャラリーコントロールの Items
プロパティには、添付ファイルコントロール (ここではDataCardValue5) のAttachments
を設定します。
Attachments
プロパティにはファイルのblobパス (Value
)とファイル名 (Name
)が含まれています。今回重要になるのはValue
の方です。
単一ファイルの時と同様に、これを画像コントロールに設定し、JSON関数を利用することで添付ファイルのBase64文字列が得られます。
2. ギャラリーに画像コントロールを追加
添付ファイルコントロールのファイル、あるいはPower AppsでファイルのBase64文字列を得る場合のポイントは、画像コントロールを利用することでした。
複数ファイルの場合にも画像コントロールを中継することでBase64文字列を得ます。このために、変換用ギャラリーには画像コントロールを追加しておきます。
画像コントロールのImage
プロパティには ThisItem.Value
をセットしましょう。
準備はこれで完了です。あとはファイル名とファイルのBase64文字列 (data Uri) を含むコレクションを作っていきます。
3. Base64への変換はJSON関数とAddColumns
JSON(画像, IncludeBinaryData)
この組み合わせでBase64文字列が得られるのはこのブログでもすでに紹介した通りです。
複数ファイルの場合には、変換用ギャラリーの画像コントロールを対象とすることで同じようにBase64文字列が得られます。
ボタンを追加して以下の数式を追加します。
ClearCollect( base64Collection, ShowColumns( AddColumns( Gallery1.AllItems, "data", Substitute( JSON( Image2.Image, IncludeBinaryData ), """", "" ) ), "Name", "data" ) )
Gallery1.AllItems
にはギャラリー内のコントロールなども含まれるので、これで画像コントロールを Image
プロパティにアクセスできるようになります。
あとはJSON関数で生成するBase64文字列をAddColumns
関数で追加し、コレクションに格納しています。
結果、生成されたコレクションには、ファイル名とBase64文字列が含まれます。
注意事項
ここでは数文字のテキストファイルやhtmlファイルでテストしているので文字列をフルで表示していますが、通常は数万文字程度にまでなるので、うっかり検証用のギャラリーを追加しているとブラウザ-が固まります。
動作の妥当性は軽いテキストで行って、利用するときには消すか非表示にしましょう。
おわり
最後はJSON関数をもう一度使ってファイル名とBase64文字列を含む配列 (の文字列) を得ます。
あとは下のブログで紹介しているようにフロー側でJSONを解析して、Apply to eachでファイル登録を行ったり、画像解析のソースにしたり、ExcelならテーブルのデータをDBに追加したりと応用は様々です。
Power Appsからのファイルアップロードでお困りの際には参考にしていただければ幸いです。