技術情報ブログ
Power Apps
2025.02.05

【Power Apps】添付ファイルコントロールにアップしたファイルのサイズを取得する方法

【Power Apps】添付ファイルコントロールにアップしたファイルのサイズを取得する方法
伊礼圭吾

初めまして、8月よりアーティサン株式会社のメンバーになった伊礼(いれい)です。

Power Appsでファイルのアップロードなどの機能を実装する場合は、基本的に添付ファイルコントロールを使用することになると思います。

しかし添付ファイルコントロールにはアップロードしたファイルのファイルサイズを取得する機能がありません。

この仕様は意外な落とし穴で、実際にファイルアップロード処理のあるアプリを構築していると、

  • アップロード先のストレージに容量の制限があり、アップロード処理を実行する前にPower Apps上でファイルの合計サイズを確認できるようにしたい

  • ファイルサイズが大きくアップロード時間が長くなってしまう事態を避けたい

といった要件が出てくることは少なくありません。

そこで今回は、添付ファイルコントロールにアップロードしたファイルのそれぞれの容量を取得する方法についてご紹介したいと思います。

添付ファイルコントロールにアップしたファイルのサイズを取得した動作イメージ

今回ご紹介する方法は正確なファイルサイズの取得を保証するものではございません。
また、Power AppsやMicrosoftで公式的に推奨されているものではない点にもご注意ください。

 

添付ファイルコントロールとは

最初に、添付ファイルコントロールについて軽くおさらいしておきましょう。

まず添付ファイルコントロールは、挿入タブのコントロール一覧から直接アプリに追加することができません。
ではどこから追加するのかというと、編集フォームコントロールから行います。

編集フォームコントロールをアプリに追加してデータソースを指定すると、データソースの項目に応じて様々なコントロールが自動で生成されます。
その中の添付ファイルの項目に、添付ファイルコントロールが存在します。

編集フォーム

つまり添付ファイルコントロールをアプリに追加する際は、一度編集フォームをアプリに追加して、そこから添付ファイルコントロールをコピー&ペーストで抜き出すことになります。

そして、実際にアップロードしたファイルの情報はAttachmentsプロパティから取得することができます。 更にAttachmentsプロパティはテーブル構造となっており、格納されている情報は次の2つになります。

  • Attachments.Name

    アップロードしたファイルのファイル名

  • Attachments.Value

    アップロードしたファイルのBlobパス(URIテキスト)

Blobというのは、Azure Blob StorageというAzureが提供しているクラウドストレージサービスのことで、添付ファイルコントロールからアップロードしたファイルは、一時的にBlobのストレージに保存され、Attachments.Valueにはそのパスが格納されています。

その他に設定できる主要なプロパティとしては以下の通りです。

  • MaxAttachments

    添付できるファイルの最大の数

  • MaxAttachmentSize

    添付できるファイルの最大のサイズ

  • OnAddFile

    ファイルを追加したときに実行される動作

  • OnRemoveFile

    ファイルを削除したときに実行される動作

ここで注意すべき点として、 MaxAttachmentSizeで指定されるファイルの最大サイズは、ファイル単体のサイズになります。

そのため、MaxAttachmentSizeに10MBを指定した場合それぞれのファイルが10MB以下であることは分かりますが、それぞれの詳細なファイルサイズや合計のファイルサイズについては取得することができません。

これでは個々や合計ファイルサイズによる制御ができないため、例えばファイルサイズが大きすぎて保存先になるデータソースで受け入れることができない、もしくはPowerAutomateのアップロード処理に時間がかかりすぎてしまうなどの問題が考えられます。

Power Apps の 添付ファイル コントロール

 

添付ファイルコントロールからファイルサイズを取得する方法

それでは実際にファイルサイズを取得する方法について解説していきます。

 

1.コントロールの配置

最初に添付ファイルコントロールとギャラリーを配置します。
配置したギャラリーにはラベル2つと画像を格納しましょう。

コンポーネントツリー

 

2.ファイルサイズ取得処理の実装

本題のファイルサイズ取得を実装していきます。
まずはアップロードしたファイルたちをコレクションに格納していく処理です。

FileUploader.OnAddFile

//アップロードされたファイルの情報をcolFilesに格納する
ForAll(
    FileUploader.Attachments As addFile,
    Collect(
        colFiles,
        {
            Name:addFile.Name,  //ファイル名
            Content:addFile.Value,  //blobのパス
            Size:0  //ファイルサイズを格納する列(現時点では0としておく)
        }
    )
);

//添付ファイルコントロールのリセット
Reset(FileUploader);

ここではアップロードしたファイルをcolFilesというコレクション変数に格納しています。

ColFileに格納する値としては以下の通りです。

  • Name:ファイルの名前

  • Content:ファイルのBlobパス

  • Base64:ファイルのBase64テキスト(現時点では空欄)

  • Size:ファイルのサイズ(現時点では0)

次に、1.で配置したギャラリーのItemsや子コントロールを設定しましょう。

galFileLists.Items

colFiles

FileName.Text

ThisItem.Name

FileSize.Text

"ファイルサイズ:" & ThisItem.Size

imgFileContent.Image

ThisItem.Content

これでアップロードしたファイルの情報がギャラリーで表示されます。 ここまでくればもう少しです。

再度添付ファイルコントロールのOnAddFileに戻り、以下の式を追加します。

FileUploader.OnAddFile

//ファイルサイズを取得してcolFilesのSize列に格納
ForAll(
    galFileLists.AllItems As File, //galFileListsのアイテムをソースにForAllを実行
    If(
        File.Size = 0, //ファイルサイズを取得済みのアイテムについては処理を行わない

        //colFilesのSize列を更新する
        Patch(
            colFiles,

            //colFilesとgalFileListsのアイテムをblobパスで突合
            LookUp(
                colFiles,
                ThisRecord.Content = File.Content
            ),
            With(
                {
                    //取得したBase64形式のテキストから不要な文字列を取り除く
                    Base64:Substitute(Substitute(Match(JSON(File.imgFileContent.Image,JSONFormat.IncludeBinaryData),"(?<=base64,).*").FullMatch,"""",""),"=","")
                },
                {
                    //不要な文字列を取り除いたBase64テキストの文字数をカウントし6/8倍する
                    Size:Len(Base64)*6/8
                }
            )
        )
    )
);

ここでは先ほど作成したcolFilesコレクションに対し、ファイルサイズを計算しPatch関数でsize列の更新を行っています。

ポイントは3つになります。

  • 対象ファイルのBase64テキストの取得

    Power Automateなどと連携してファイルのアップロード処理を実装したことのある方はご存じかもしれませんが、添付ファイルコントロールのValueを画像コントロールのImageに適用しJson関数で変換することで、ファイルデータをBase64形式で取得することができます。

  • バイナリーデータとファイルサイズの関係

    コンピュータ上においてファイルはバイナリーデータで扱われます。

    このバイナリーデータというのはつまるところ2進数のデータなのですが、ファイルサイズとはこのバイナリーデータの量を表したものになります。
    ※ここで解説しているファイルサイズは、Windows上などでファイルを扱う際に付随するメタデータ(ファイル名や作成者情報など)を除いた純粋なデータサイズを指します。

  • Base64とバイナリーデータの関係

    Base64形式とはバイナリーデータをテキスト形式にエンコードする方式です。

    これはバイナリーデータを扱えない環境において、テキスト形式に変換することでデータを安全に保持するための技術なのですが、ポイントは変換したときのデータ量の変化です。
    詳細な解説は省きますが、Base64形式ではバイナリーデータを6bitごとに変換するため、元のバイナリーデータ量から8/6倍(約33%)増加します。

上記の3点をまとめると、

ファイルサイズ=バイナリーデータ量=Base64形式の文字量×6÷8

という式が成り立ちます。
つまり、

  • JSON(File.FileImage.Image,JSONFormat.IncludeBinaryData)でファイルデータをBase64形式で取得する。

  • Json関数で取得したBase64形式のテキストには冒頭に「data:~/~;base64,」といった文字列やダブルクォーテーション、イコールなど、不要な文字列が含まれていることがあるため、Match関数の正規表現やSubstitute関数を使用し、不要な文字列を除く。

  • 取得したBase64形式のテキストに対してLen関数を使用し文字数を取得し、結果を6/8倍する。

 

動作確認

伊礼圭吾

動作を確認してみましょう!

今回はこちらのPDFをサンプルとして使用してみたいと思います。

動作確認:サンプルPDF

添付ファイルコントロールからアップロードすると…

動作確認:添付ファイルコントロールからアップロード

このようにファイルサイズを取得できます!

もちろんPDFだけではなく、Excelのxlsxなどオフィス系のファイル画像ファイルなども取得することができます!

動作確認:添付ファイルコントロールからアップロード

また、上記のアプリではファイルサイズをBytes単位で表示していますが、単位をKB、MBと大きくすることも可能です。

その場合はBytesKBMBと単位を大きくするごとに1024で割っていくことになります。
※Windows上では1KB = 1024Bytesという計算になります。

FileSize.Text

"ファイルサイズ:" & Text(ThisItem.Size/1024/1024,"0.0") & " MB"
動作確認:ファイルサイズの単位を変更

そして、アップロードしたファイルの合計サイズはSum関数を使用することで求めることができます。

lblTotalSize.Text

"合計 " & Text(Sum(colFiles,Size)/1024/1024,"0.0") & " MB"
動作確認:アップロードしたファイルの合計サイズ

このようにしてファイルサイズの合計値を求めることで、 アップロードするファイルのサイズが大きすぎないかをPower Apps内で事前にチェックすることができますね!

 

おわりに

以上がPower Apps上にアップロードしたファイルのファイルサイズを取得する方法でした。

添付ファイルコントロール自体には標準でサポートされていないファイルサイズの取得ですが、 ファイルサイズやデータ形式の関係をもとに計算を行うことで概ねの値を求めることが可能です。

これによりアップロードを行いたいファイルのサイズが適切な範囲かをPower Apps上で確認することができますので、 想定外の動作や不要なエラーを避け、システムの安全性を向上させることが可能になります。

なお、以下の一般的なファイルの種類についてはファイルサイズ取得の動作を確認しております。

  • PDF

  • Word

  • Excel

  • Power Point

  • txt

  • csv

  • Zip

  • mp3

  • mp4

再三の注意とはなりますが、

  • Power AppsやMicrosoft公式の手法ではない

  • 確実に正確なファイルサイズを求められるものではない

  • ファイルの種類によっては正常に動作しない可能性がある

こういったポイントには留意いただいた上でご参考にしていただけますと幸いです。

ぜひ皆さまもPower Appsでの開発を楽しんでいただければと思います!
それでは!

Power Platform(SharePoint・Power Apps・Power Automate)に関する営業活動や設計、開発などを担当:伊礼 圭吾

伊礼 圭吾

音楽と料理が生きがいです Power Platform関連を中心に、ローコードノーコード関連とかで学んだことをアウトプットしていきます。

シェアする
記事カテゴリ
最新記事
2025.02.05

【Power Apps】添付ファイルコントロールにアップしたファイルのサイズを取得する方法

2025.01.29

はじめてのMicrosoft Copilot Studio(1) Copilotサービスの整理、使用するサービスの最適解とは?

2025.01.22

【小ネタ】Power Automate×SharePoint:登録者・更新者・登録日・更新日列を変更する方法

2025.01.15

SharePointのデザインをもっとおしゃれに!(X-SP Style | SharePoint デザイン拡張サービスのご紹介)(3) サンプルの紹介

2025.01.08

Power Apps モデル駆動型アプリ:項目の表示・非表示を切り替える方法

モデル駆動型アプリPower AppsPower PlatformSharePointExcelPower AutomateC#attributevalidationローコードAngularAccessInfoPathMatTableAngular Materialデータ構造SortByColumns関数TypeScriptHTMLEF CoreマイグレーションFramework CoreAttribute directivesO/Rマッパーazure sql databaseCase式HTTP RequestCSSxUnit.Net Core 3.1VSCode.Net Core Test ExplorerDataverse for Teamsitem関数Google MapsMarker ClustererRANK()関数Dynamics 365 SalesMicrosoft TranslatorマーカークラスタリングライブラリtailwindcssマルチテナントドロップダウンメニューBreakpointObserverメディアクエリスマホPCレスポンシブ入門初心者中級者キャンバスアプリDatePickerDropdownviewビューアクセス制限承認リマインドSetForAllUpdateContextロードマップ技術It情報技術メッセージIDメールfirst()関数nest入れ子動的リストcollectionコレクション複数の添付ファイル承認フローformエクスポートインポートカスタマイズcomponentダイアログコンポーネントdialogTips新機能変数検索Microsoft 365グループセキュリティグループ送信元メールの送信差出人インスタントクラウドフロー自動化したクラウドフロー委任VBAエラーエクセルerror復元restorePower BI個人列ユーザー列SharePoint Onlineリスト非表示アプリ[市民開発者構築自動化したクラウド フローフローの種類インスタント クラウド フロースケジュール済みクラウド フローレスポンシブ レイアウトresponsive layoutデータ行の制限引き継ぎ退職所有者を変更異動LoopMicrosoftdesignJSONデザイン運用選択肢列参照列ChatGPTOpenAIオープンAIチャットGPTgalleryギャラリースクロールコンテナショートカットキーshortcut keyconcat関数文字制限フロー実行開発環境環境本番環境ライセンス環境構築手順pipelineCI/CDパイプラインDevOpsMicrosoft 365簡易在庫管理時間外通知ファイルフィルター クエリドキュメント ライブラリfilter querysortソートmultiple item複数項目シェアポイント便利機能カレンダーCalendarTeamsローコード開発非エンジニア体験談勉強内製化市民開発管理ガバナンスerror notificationエラー通知削除フォルダゴミ箱完全削除モデル駆動型セキュリティロールビジネスルールDataverseJavaScript表示切替登録者システム列登録日更新者更新日変更SharePoint FrameworkSPFxサンプルsampleX-SPStyleStudioAI生成系AICopilotlicense添付ファイルコントロールファイルサイズ
PageTop
ページトップに戻る