You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在存储到服务器前通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:35:22