朝から雨が降り続ける日曜日、娘たちを送って、また迎えに行く・・・今日はお隣が地鎮祭
建設にアップする画像の軽量化のルーチンを組み込んで、DBに取り込む画像の軽量化を図る

画像アップロード共通化・圧縮対応
1.概要
システム全体の画像アップロード処理を共通サービス化し、GDライブラリによる圧縮・リサイズを追加した
2.対象箇所の調査結果
| コントローラー | メソッド | 最大 | ストレージパス |
|---|---|---|---|
| CompanyAdminController | uploadLogo | 5MB | company_logos/ |
| ProjectController | uploadPhoto | 50MB | photos/ |
| ChecklistController | uploadEvidence | 50MB | evidence/ |
| ConstructionPlanController | uploadItemImage | 5MB | plans/{id}/images/ |
| ConstructionPlanController | uploadTemplateImage | 5MB | templates/images/ |
| SafetyPatrolController | storePhoto | 10MB | patrol_photos/ |
以下は非画像混在・CSV等のため対象外とした:
- RiskAssessmentController(Excel/Word/PDF/Image混在)
- SafetyPatrolController::store(PDF/Image混在、圧縮不可のPDFが主)
- AdminController, AuditMasterController, EnvironmentController, IsoClauseController(CSVのみ)
3.新規作成ファイル
3-1.app/Services/ImageUploadService.php
機能:
storeCompressed()メソッドで画像を圧縮・リサイズして保存
PHP標準GDライブラリを使用した画像圧縮共通サービス
デフォルト最大サイズ: 1280×960px(Web閲覧に十分な解像度)
GD処理失敗時もオリジナルを保存してフォールバック
JPEG品質: 80%(ファイルサイズと品質のバランス)
PNG画像は透過を保持してPNGのまま圧縮(compression level 7)
JPEG/GIF/WebP はJPEG 80%に変換
非画像ファイル(PDF等)は圧縮せずそのまま保存(フォールスルー)
isImageFile()` で画像/非画像の判定も提供
パラメータ:
storeCompressed(
UploadedFile $file,
string $directory,
string $disk = ‘public’,
?string $filename = null, // nullなら UUID.jpg 自動生成
int $maxWidth = 1280,
int $maxHeight = 960,
int $quality = 80
): string
6.技術仕様
- 使用ライブラリ: PHP標準 GD(gd extension確認済み)
- exif extension も使用可能(将来の向き自動補正対応に備え)
- Intervention Image等のサードパーティは不使用(composer.jsonに追加なし)
- 構文チェック: 全6ファイルphp -lでエラーなし確認済み
4.変更ファイル
4-1.app/Http/Controllers/CompanyAdminController.php
use App\Services\ImageUploadService;を追加
uploadPhoto()t:sore()→storeCompressed() に変更(デフォルト1280×960px)
4-2.app/Http/Controllers/ChecklistController.php
use App\Services\ImageUploadService; を追加
uploadPhoto():store()→storeCompressed()に変更(デフォルト1280×960px)
4-3.app/Http/Controllers/ChecklistController.php
use App\Services\ImageUploadService;` を追加
uploadEvidence():画像ファイルのみstoreCompressed()、PDFは `storeAs()のまま分岐処理
4-4.app/Http/Controllers/ConstructionPlanController.php
use App\Services\ImageUploadService; を追加
uploadItemImaget(): sore() → storeCompressed() に変更
uploadTemplateImage(): store()→storeCompressed()に変更
4-5.app/Http/Controllers/SafetyPatrolController.php
use App\Services\ImageUploadService;` を追加
storePhoto(): storeAs() → storeCompressed()に変更(カスタムファイル名パラメータ渡し)
5.期待効果
| 状況 | 変更前 | 変更後 |
|---|---|---|
| スマホ撮影写真(12MP、5MB程度) | そのまま保存 | 1280px以内に縮小、JPEG80%で約150-300KB |
| 5MBのロゴ画像 | そのまま保存 | 800px以内に縮小、約50-100KB |
| 既存の小さい画像 | そのまま | リサイズ不要の場合は品質のみ調整 |
| PDFエビデンス | そのまま | 変更なし(対象外) |


