如何在存储到服务器前通过Storage函数压缩图片大小
给Laravel模型更新函数添加图片压缩功能
1. 安装图片处理库
使用Composer安装Intervention Image——Laravel生态中常用的图片处理工具:
composer require intervention/image
2. 修改原函数代码
在函数所在文件顶部导入必要的门面:
use Intervention\Image\Facades\Image; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\File;
替换原函数中存储图片的逻辑,加入压缩处理:
public static function pre_update($Model, $data, $id) { $m = $Model::find($id); if ($m) { $field = $m->getFillable(); $name = explode("App\\", $Model)[1]; foreach ($data as $key => $value) { if (in_array($key, $field)) { if (in_array($key, $m->getFiles())) { $fop = $m->getOriginal()[$key]; if (Storage::has($fop)) Storage::delete($fop); $image = $value; $fpath = "img/" . strtolower($name) . "/" . uniqid() . '_' . $image->getClientOriginalName(); $m->$key = $fpath; // 图片压缩核心逻辑 $compressedImage = Image::make($image) ->resize(null, 800, function ($constraint) { $constraint->aspectRatio(); // 保持宽高比 $constraint->upsize(); // 不放大小于目标尺寸的图片 }) ->encode($image->getClientOriginalExtension(), 70); // 按原格式编码,质量设为70(0-100可调) Storage::put($fpath, $compressedImage); } else { $m->$key = $value; } } } return $m; } else { return null; } }
3. 关键参数说明
- 尺寸限制:
resize(null, 800)设置图片最大高度为800px,可根据需求修改数值 - 质量控制:
encode()方法第二个参数为压缩质量,数值越小压缩率越高,建议在60-80之间平衡画质与体积 - 格式兼容:自动沿用原图片的扩展名,避免格式转换导致的异常
内容的提问来源于stack exchange,提问作者Edward NANDA
相关产品推荐
相关产品推荐

