画像アップロード画面#
ID#
scr001-upload
関連仕様・設計#
| 種別 | ドキュメント |
|---|---|
| 要件 | req001-upload |
| 相互作用 | ia001-upload |
| API | api001-upload / api002-upload / api003-upload / api004-upload |
概要#
…
- ユーザーがローカル端末から画像を選択・プレビューし、S3へアップロードする
- アップロード済み画像のファイル名一覧を表示し、選択した画像をプレビュー閲覧できる
レイアウト#

遷移#
単一画面(画面遷移なし)
項目#
| No | 項目名 | 種類 | 説明 | 初期状態 | 制約 | 備考 |
|---|---|---|---|---|---|---|
| 1 | 画像選択ボタン | Button / Input | ローカルからファイル選択ダイアログを開く | 活性 | アップロード済み5枚時はDisabled | 上限到達時は項目4に「最大アップロード数に達しました」を表示 |
| 2 | 選択画像プレビュー | Image | 現在選択されている(未アップロード)画像のプレビュー | 非表示 | — | ファイル選択後に表示。アップロード完了後にクリア |
| 3 | アップロードボタン | Button | S3へのアップロードとDB登録を開始する | 非活性 | 画像未選択時はDisabled | — |
| 4 | ステータスメッセージ | Text | 成功・エラー・警告を表示する | 空 | — | アクション結果に応じて動的に更新 |
| 5 | 画像リスト | List | アップロード済みのファイル名を一覧表示する | 画面表示時にDBから取得 | — | 画面初期表示時に api003 を呼び出す |
| 6 | ギャラリープレビュー | Image | リストで選択されたアップロード済み画像のプレビュー | 非表示 | — | 項目5のファイル名クリック時に api004 で取得したURLを表示 |
アクション#
| No | アクション名 | トリガー | 処理概要 | 期待結果 | API | 備考 |
|---|---|---|---|---|---|---|
| 1 | 初期表示 | 画面表示時(自動) | アップロード済み画像のメタデータ一覧を取得 | 項目5にファイル名リスト表示 | api003 | — |
| 2 | ファイル選択 | 画像選択ボタン押下 | ファイル形式・サイズをクライアントバリデーション後、プレビューを生成 | 項目2にプレビュー表示、項目3を活性化 | — | バリデーション違反時は項目4にエラー表示(MSG-UI-001/MSG-UI-002) |
| 3 | アップロード実行 | アップロードボタン押下 | Presigned URL取得 → S3アップロード → メタデータ保存 | 項目4に成功メッセージ(MSG-UI-C001)表示、項目5のリスト更新 | api001 → api002 | 完了後にアクション5を実行。失敗時はMSG-UI-C004/MSG-UI-C005を表示 |
| 4 | リスト項目選択 | 項目5のファイル名クリック | 選択画像の閲覧用Presigned URLを個別取得して表示 | 項目6にプレビュー表示 | api004 | 初期表示時は取得しない(遅延取得) |
| 5 | プレビュークリア | アップロード完了後(自動) | 選択状態と項目2のプレビューをリセット | 項目3を非活性化 | — | アクション3の完了後に自動実行 |
バリデーション(クライアントサイド)#
アクション1(ファイル選択時)に実施する。違反時は項目4にエラーメッセージを表示し、リクエストを送信しない。
| 検証項目 | 条件 | エラー時の挙動 |
|---|---|---|
| ファイルサイズ | 5,242,880 バイト(5MB)超 | MSG-UI-002表示・項目3を非活性 |
| ファイル拡張子 | .jpg .jpeg .png .gif .webp 以外 | MSG-UI-001表示・項目3を非活性 |
MIMEタイプ(file.type) | image/jpeg image/png image/gif image/webp 以外 | MSG-UI-001表示・項目3を非活性 |
エラーハンドリング#
| エラー種別 | 発生箇所 | HTTPステータス | メッセージID | 対応 |
|---|---|---|---|---|
| Presigned URL有効期限切れ | S3アップロード時 | 403 Forbidden | MSG-UI-004 | 再度アップロードを促す |
| S3アクセス権限エラー | S3アップロード時 | 403 Access Denied | MSG-UI-005 | 管理者連絡を促す |
| ネットワークタイムアウト | S3アップロード時 | - | MSG-UI-003 | リトライ処理実行 |
| ファイルサイズ超過(S3制約) | S3アップロード時 | 400 Bad Request | MSG-UI-002 | クライアントバリデーション強化 |
| API通信エラー | api001/api002呼び出し時 | - | MSG-UI-C004 | リトライ処理実行 |
| サーバーエラー | api001/api002呼び出し時 | 500+ | MSG-UI-C005 | しばらく待って再試行を促す |
懸案事項#
データ整合性の懸念#
- S3とDBの不整合: API設計(api002)と同様の懸念事項
- フロントエンドがS3アップロード完了後、バックエンド処理でエラー発生時の対応
- 影響: S3に実態のみが残る状態
- 要検討: クリーンアップ処理 or ロールバック機構
UI表示の懸念#
- 大量データ時の表示性能: TBD
- 画像リスト(項目5)の件数増加による画面表示の遅延
- 対応方針: ページネーション導入 or 無限スクロール
- 影響: ユーザー体験の低下、メモリ使用量の増加
エラーハンドリングの網羅性#
S3直接アップロード時のエラー: TBD
- Presigned URL有効期限切れ(403 Forbidden)
- S3アクセス権限エラー(403 Access Denied)
- ネットワークタイムアウト
- ファイルサイズ超過(S3制約)
- 対応: 各エラーに応じたメッセージ表示、リトライ処理
その他エラーシナリオ: TBD
- 現状定義外のエラーパターンの網羅
- 影響: ユーザー体験の低下
TBD#
UI/UXの作り込み#
スケルトン表示
- 初期表示時(api003呼び出し)のローディング表示
- ギャラリープレビュー(api004呼び出し)のローディング表示
- 実装方式: CSSアニメーション or ライブラリ利用
プログレスバー
- S3アップロードの進捗表示
- 実装方式: XMLHttpRequest.upload.onprogress or AWS SDK Progress
- UI配置: 項目4のステータスメッセージ領域に統合 or 専用エリア
パフォーマンス最適化#
画像プレビューの最適化
- 大容量画像のプレビュー生成時のパフォーマンス
- サムネイル生成のクライアントサイド実装
- メモリ使用量の制御
リスト表示の仮想化
- 大量アップロード時のパフォーマンス対策
- 実装方式: react-window or react-virtualized
- 導入閾値: 100件以上(検討中)