雨の竜王公園を散歩 アップロード画像の縮小

娘たちを茶会に送り、雨の竜王公園で甲斐犬のキクと散歩

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

建設アシストの最初の画面を組織全体の管理画面として、組織urlをインフレームにしていたが、ほとんどエラーとなるので、画像に切り替え

画像アップロード共通化・圧縮対応

1.概要

システム全体の画像アップロード処理を共通サービス化し、GDライブラリによる圧縮・リサイズを追加した

2.対象箇所の調査結果

コントローラーメソッド最大  ストレージパス
CompanyAdminControlleruploadLogo5MBcompany_logos/
ProjectControlleruploadPhoto50MBphotos/
ChecklistControlleruploadEvidence50MBevidence/
ConstructionPlanControlleruploadItemImage5MBplans/{id}/images/
ConstructionPlanControlleruploadTemplateImage5MBtemplates/images/
SafetyPatrolControllerstorePhoto10MBpatrol_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エビデンスそのまま変更なし(対象外)

ブックマークする パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

  • 2026年6月
    1234567
    891011121314
    15161718192021
    22232425262728
    2930