6414222a18
Run Tests / test (pull_request) Successful in 2m0s
實作 openspec change course-image-compression(O3.1 體感優化): - 新增 App\Traits\CompressesImages:與聊天圖片管線參數一致的共用壓縮邏輯 - CourseImageController 封面/相簿套用壓縮,上傳上限 2MB→10MB(容納手機原圖) - 前端課程卡片與相簿縮圖加 loading=lazy(詳情頁首屏封面刻意不加) - CourseImageTest +4 案例(10MB 邊界、轉存 .jpg、>2048 縮小、小圖不放大) - course-image-upload 主規格同步(新增伺服器端壓縮 requirement) 容器內全套件 155 passed / 400 assertions。 聊天端改用 trait 留待後續(該處無測試覆蓋,不在本 change 重構)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
34 lines
953 B
PHP
34 lines
953 B
PHP
<?php
|
|
|
|
namespace App\Traits;
|
|
|
|
use Illuminate\Http\UploadedFile;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Str;
|
|
use Intervention\Image\Drivers\Gd\Driver;
|
|
use Intervention\Image\ImageManager;
|
|
|
|
trait CompressesImages
|
|
{
|
|
/**
|
|
* 壓縮上傳圖片並存入 public disk,回傳相對路徑。
|
|
* 參數與聊天圖片管線一致(scaleDown 2048 + JPEG quality 85),
|
|
* 確保平台內影像處理行為單一來源。
|
|
*/
|
|
private function compressToJpeg(UploadedFile $file, string $directory): string
|
|
{
|
|
$manager = new ImageManager(new Driver());
|
|
$image = $manager->read($file);
|
|
|
|
if ($image->width() > 2048 || $image->height() > 2048) {
|
|
$image->scaleDown(width: 2048, height: 2048);
|
|
}
|
|
|
|
$path = trim($directory, '/') . '/' . Str::uuid() . '.jpg';
|
|
|
|
Storage::disk('public')->put($path, $image->toJpeg(quality: 85));
|
|
|
|
return $path;
|
|
}
|
|
}
|