はじめに
Web アプリケーションでファイルをアップロードする機能を実装する際、
以下のような制限が求められるケースは非常に多くあります。
- 特定の拡張子のみ受け付けたい(例:PDF、Excel のみ許可)
- ファイルサイズに上限を設けたい(例:10MB まで)
- ファイル名の文字種を制限したい(例:記号禁止、日本語不可)
しかし、OutSystems の Upload ウィジェットは非常にシンプルな構造で、
これらの制御を 標準機能だけではほとんど実現できません。
本記事では、
OutSystems 標準でできること/できないこと を明確にしたうえで、
拡張子・ファイルサイズ・ファイル名の文字種を制限する方法を
- Forge を使う方法
- 標準だけで実装する方法
の 2 パターンで紹介します。
2. 「標準機能(Reactive)」でできること
2-1. Upload ウィジェットの仕様
- 同時アップロードは 1 ファイルのみ
-
拡張子フィルタが可能(AttributesでAcceptを指定)
例:.pdf, .xlsxと指定すると選択ダイアログで絞り込み可能
※ただしブラウザ依存のため「完全な制御」にはならず、後続のチェックは必須 -
ファイルサイズ上限の自動制御なし
※サイズはBinaryDataSize(サーバーアクション)で取得できるが
サーバーアクションのためファイルをアップロードした後でしか確認できない -
ファイル名の事前制御なし
※ファイル名(FileName)はファイル選択後の OnChange(クライアントアクション) で取得可能
2-2. 標準で「できない」こと
- 拡張子を 完全に 制限すること
(File Typesはフィルタであって強制ではないため、選択後に自前チェックが必要) - ファイルサイズ上限の自動制御
(BinaryDataSizeがサーバーアクションのため、事前チェックは不可) - ファイル名の文字種(記号・日本語など)の自動判定
- 不正ファイル選択をその場でブロックする機能
(OnChange → ロジックで検証 → エラー表示 の流れを自前で実装する必要がある)
このため
Forge の利用 または クライアント/サーバーのバリデーション実装 が必須になります。
📝 補足 Upload の Accept プロパティでできること/できないこと
Upload ウィジェットには Accept プロパティがありますが、指定できるのは以下のような 大まかなカテゴリのみです。
- Image
- Video
- Any
つまり、
.pdf や .xlsx のような具体的な拡張子フィルタは設定できません。
■ ファイル選択時のフィルタ(accept 属性)について
ブラウザの ファイル選択ダイアログに拡張子フィルタを適用したい場合は、
Upload ウィジェットの Attributes に HTML の accept 属性を手動で追加する必要があります。
例:PDF と Excel のみ選択可能にしたい場合
accept=".pdf,.xlsx"
参考記事:
https://zenn.dev/ak2ie/articles/f8db5d11d29114
■ 仕組み
- ブラウザが「ファイル選択ダイアログ」の表示内容を絞るだけ
- アップロードを強制的にブロックするわけではない
→ サーバー側(またはクライアントアクション)で必ずチェックが必要
拡張子がPDFがデフォルトとなるが、「すべてのファイル」に変更可能

■ MIME タイプと拡張子の違い
accept には拡張子だけでなく MIME タイプも指定できます。
例:
accept=".pdf,application/pdf"
それぞれには次のような特徴があります。
-
拡張子
- 利点:ブラウザが安定して判定できる
- 欠点:ユーザーがファイル名を書き換えれば偽装できる
-
MIME タイプ
- 利点:OS・ブラウザが内部的に判定するため、拡張子より偽装されにくい
- 欠点:ブラウザや環境によって MIME の判定が揺れることがある
(例:同じ.xlsxでもブラウザによって MIME が異なる場合がある)
■ Upload の Accept プロパティとの違い
| 機能 | 指定内容 | 拡張子の細かい指定 |
|---|---|---|
| Upload の Accept プロパティ | Image / Video / Any | ❌ できない |
| Attributes の accept 属性(HTML) |
.pdf,.xlsx 等 |
⭕ 可能 |
次の記事に続きます
OutSystems の Upload は便利ですが、そのままでは厳密なチェックはできません。
業務アプリで安全に扱うには、Forge か カスタムバリデーションがほぼ必須になります。
この続きは別記事で詳しく解説します
- その2:Forge を使う版
- その3:JavaScript・標準だけで実装する版
