Power Appsでファイルアップロード機能を実装するときに気をつけるべきポイント

こんにちは。DXソリューション営業本部の吾妻です。
Power AppsやPower Pagesで承認ワークフローや台帳管理系アプリを構築する際に、テキストデータを提出すると同時に、ファイルを「添付」させたいという要件がよくあるかと思います。
今回は、Dataverseに対してファイルをアップロードさせる機能を実装する際のポイントを、いくつかご紹介しようと思います。
Dataverseでのファイル格納方法
テーブルにファイルを格納するための方法として、Dataverseでは、以下の3種類が用意されています。アップロード対象とするファイルの形式やサイズによって、最適な方法を選ぶ必要があります。
また、システムの要件、ストレージ容量やコストの想定によっては、ファイル自体はAzure Blob StorageやSharePointドキュメントライブラリに格納して、Dataverseの列としてはそこへのURLのみ持たせるような方法を採用することもあります。
方法 | 格納先 | 備考 |
File列 | カスタムテーブルにファイルを格納する | システム設定でブロックされていない拡張子/MIMEタイプを持つファイルだけ格納できる |
Image列 | カスタムテーブルに画像ファイルを格納する | GIF、JPEG、TIFF、BMP、PNGの画像ファイルだけ格納でき、その画像のサムネイルも一緒に保存される |
添付ファイルとメモ | メモ(annotations)テーブルにファイルを格納し、カスタムテーブルからリレーションで辿れるようにする | カスタムテーブルを作成する際に「添付ファイルを有効にする(メモとファイルを含む)」を有効化する必要があり、File列と同様にシステム設定でブロックされていない形式のファイルだけ格納できる |
ポイント① ファイルサイズ
ファイルサイズの上限は、 File列 と 添付ファイルとメモ では128MB、 Image列 では30MBまでとなっています。ただし、通常のフォームからファイルをアップロードするのではなく、Web API経由でファイルを複数のチャンク(ブロック)に分割しながらアップロードする場合には、File列に10GBまでのファイルを格納することができます。
つまり、数十MBのオーダーであれば、いずれの方法でも対応できますし、それ以上のサイズであってもなんとかなるといえます。
ただし、現実的には、Power Apps Premiumなどのプランに付属している容量を超過する場合は、キャパシティアドオンを購入しなければならず、このライセンスコストがそれなりに高価であるため、数百、数千MBのファイルをどんどん格納するようなシナリオは想定しにくいかと思います。
ポイント② ファイル形式
先ほどの表の中にもありましたが、システム設定において、ブロック指定されている拡張子を持つファイルをアップロードすることはできません。
既定で指定されている拡張子は、以下に列挙したものです。
拡張子 |
ade;adp;app;asa;ashx;asmx;asp;bas;bat;cdx; cer;chm;class;cmd;com;config;cpl;crt;csh;dll; exe;fxp;hlp;hta;htr;htw;ida;idc;idq;inf; ins;isp;its;jar;js;jse;ksh;lnk;mad;maf; mag;mam;maq;mar;mas;mat;mau;mav;maw;mda; mdb;mde;mdt;mdw;mdz;msc;msh;msh1;msh1xml;msh2; msh2xml;mshxml;msi;msp;mst;ops;pcd;pif;prf;prg; printer;pst;reg;rem;scf;scr;sct;shb;shs;shtm; shtml;soap;stm;tmp;url;vb;vbe;vbs;vsmacros;vss; vst;vsw;ws;wsc;wsf;wsh;svg |
ここで注意が必要なのは、ファイル形式の判定は拡張子のみで行われるということです。
通常Webアプリケーションでファイルアップロード機能を実現する場合、ファイルに含まれるマジックナンバーやコンテンツ自体をもとにして、ファイル形式を判定しますが、Dataverseでは拡張子のみで判定しているため、ファイルの拡張子を書き換えてしまえば、例えばファイルの実体がEXEファイルであってもアップロードできてしまいます。
Power Appsで組織内向けのアプリを構築するうえではそこまで危険性は高くないかと思いますが、Power Pagesで社外向けのサービスを構築したり、社外から送付された添付ファイルを(そのまま or なんらかの加工を加えて)Dataverseに格納するようなPower Automateクラウドフローを実装する場合には、リスクがあることを押さえておく必要があります。
ポイント③ ファイル名
アップロードされたファイルの「オリジナルのファイル名」は、 File列 では「File列名_Name」列に、 添付ファイルとメモ ではFileName列に自動的に格納されますが、 Image列 では保持されません。そのため、Image列を利用する際には、オリジナルのファイル名を後で参照する必要があるかを検討し、必要であれば独自にカスタム列を追加してファイル名を格納するように実装します。
ポイント④ 添付できるタイミング
公式ドキュメントやメーカーポータルを眺めると、 File列 や Image列 では、 添付ファイルとメモ とは異なり、カスタムテーブルそのものにアップロードされたファイルの内容が格納されるように見えます。
しかし、実際には File列 や Image列 でも、 添付ファイルとメモ と同様に、カスタムテーブルとは別のシステムテーブルにファイルの内容が格納され、カスタムテーブルとの間に張られたリレーションで辿る仕組みとなっています。
このため、「カスタムテーブルでレコードを作成すると同時にファイルを添付して保存する」という手順をまとめて一度に実行することはできず、まず「カスタムテーブルでレコードを作成して保存」してから「ファイルを添付して保存する」という2つの手順を行う必要があります。
以下のモデル駆動型アプリのように、GUIでの操作であれば大したことではないと思われるかもしれませんが、Power AutomateクラウドフローやPowerShellなどで一括作成処理を実装したい場合に、1レコードを作成するのに2アクション(レコードの作成+添付ファイルのアップロード)必要となり、実行可能回数が半減するかもしれません。
ちなみに、格納先のシステムテーブルは、前者がFileAttachmentテーブルに、後者がActivityMimeAttachmentです。似た名前を持つテーブルとして、AttachmentやActivityFileAttachmentなどがあるため、混同しないように気をつける必要があります。
まとめ
今回は、Dataverseに対してファイルをアップロードさせる機能を実装する際のポイントを、いくつかご紹介しました。
弊社の Power Platform サポート&アプリカタログサービス では、キャンバスアプリやクラウドフローの実装に対する技術サポートから、ガバナンス管理・ガイドライン策定のご支援までを含めた、幅広いメニューをご提供しています。
まずはお気軽にお問い合わせください。
このブログで参照されている、Microsoft、Windows、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。その他の商標はそれぞれの権利者に帰属します。