UploadedFilesNormalizer
in package
$_FILES と POST のアップロードメタを、候補(1 ファイル = 1 候補)の配列へ正規化する。
image 型 / file 型で完全に同じだった前処理を一本化する。 移設前は両ブランチに同一のコードが写経されており(実測で 31 文が完全一致)、 片方だけ直すと不整合になる状態だった。
Table of Contents
Methods
- candidates() : array<int, array{_tmp_name: string, _name: string}>
- $_FILES の単一形式 / 配列形式の差を吸収し、候補のリストへ変換する。
- sanitizePathOptions() : array{old: string, filename: string}|null
- 候補の `old` / `filename` を安全な形へ整え、拒否すべき候補を判定する。
Methods
candidates()
$_FILES の単一形式 / 配列形式の差を吸収し、候補のリストへ変換する。
public
candidates(array<string, mixed> $file) : array<int, array{_tmp_name: string, _name: string}>
HTML の name="photo" は単一、name="photo[]" は配列で $_FILES に入る。
呼び出し側は候補数(count)だけを見れば両方を同じループで扱える。
Parameters
- $file : array<string, mixed>
-
$_FILES[$fieldKey]
Return values
array<int, array{_tmp_name: string, _name: string}>sanitizePathOptions()
候補の `old` / `filename` を安全な形へ整え、拒否すべき候補を判定する。
public
sanitizePathOptions(string $old, string $filename, string $uploadName) : array{old: string, filename: string}|null
処理内容(移設前の image / file 両ブランチで同一だったもの):
@rawfilename指定を「年月/元のファイル名」へ展開する(それ以外の@...は空にする)- null バイト混入対策として、先頭に空白等が付いた値を拒否する
../の連続をパスから除去する(ディレクトリトラバーサル対策の半正規化)- ファイル名が
.htaccessで終わる候補を拒否する
Why not 候補の配列をまるごと受け渡さない: 候補の配列は image / file で持つキーが違う (image は width・largeWidth・tinyWidth・squareWidth 等、file は fileSize・downloadName 等)。 配列形状を引数の型に書くと呼び出し側の推論がその形へ狭まり、他のキーが「存在しない」と 誤検出される。実際に触る 3 つの値だけを受け取る純粋関数にする。
Parameters
- $old : string
-
既存ファイルの相対パス(POST の
{fd}@old) - $filename : string
-
ファイル名オプション(POST の
{fd}@filename) - $uploadName : string
-
アップロードされた実ファイル名($_FILES の name)
Return values
array{old: string, filename: string}|null —整えた値。拒否すべき場合は null(呼び出し側はこの候補の処理をスキップする)