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

Laravel中借助elFinder实现上传图片的多尺寸缩放与复制

在Backpack+elFinder中实现多尺寸图片自动生成

1. 安装图片处理依赖

先装PHP常用的图片处理库Intervention Image:

composer require intervention/image

2. 配置Intervention Image

打开config/app.php,在providers数组里添加:

Intervention\Image\ImageServiceProvider::class

在aliases数组里添加:

'Image' => Intervention\Image\Facades\Image::class

3. 修改elFinder配置添加上传回调

找到项目里的config/elfinder.php,在roots配置块中加入上传回调逻辑,用来自动生成不同尺寸的图片副本:

'roots' => [
    [
        'driver'        => 'LocalFileSystem',
        'path'          => public_path('uploads'),
        'URL'           => url('uploads'),
        // 仅允许上传图片类型文件
        'uploadAllow'   => ['image/png', 'image/jpg', 'image/jpeg'],
        // 上传完成后触发尺寸生成
        'uploadCallback' => function($file, $elFinder) {
            // 非图片文件直接跳过
            if (!in_array($file['mime'], ['image/png', 'image/jpg', 'image/jpeg'])) {
                return true;
            }

            $originalPath = $file['path'];
            $fileName = pathinfo($originalPath, PATHINFO_FILENAME);
            $extension = pathinfo($originalPath, PATHINFO_EXTENSION);
            $dir = dirname($originalPath);

            // 生成200x200裁剪图(保持比例裁剪到指定尺寸)
            Image::make($originalPath)
                ->fit(200, 200)
                ->save($dir . '/' . $fileName . '_200x200.' . $extension);

            // 生成50x50裁剪图
            Image::make($originalPath)
                ->fit(50, 50)
                ->save($dir . '/' . $fileName . '_50x50.' . $extension);

            return true;
        },
        // 保留原有其他配置...
    ]
]

4. (可选)在CRUD控制器中同步尺寸路径到数据库

如果你的模型需要记录不同尺寸图片的路径(比如有image_original、image_thumbnail_200、image_thumbnail_50字段),可以在控制器的store和update方法里处理:

public function store()
{
    $response = $this->crud->store();
    $this->saveThumbnailPaths();
    return $response;
}

public function update()
{
    $response = $this->crud->update();
    $this->saveThumbnailPaths();
    return $response;
}

private function saveThumbnailPaths()
{
    $originalImage = $this->crud->getRequest()->input('image');
    if (!$originalImage) return;

    $fileName = pathinfo($originalImage, PATHINFO_FILENAME);
    $extension = pathinfo($originalImage, PATHINFO_EXTENSION);

    $this->crud->entry->image_thumbnail_200 = str_replace(
        "{$fileName}.{$extension}",
        "{$fileName}_200x200.{$extension}",
        $originalImage
    );
    $this->crud->entry->image_thumbnail_50 = str_replace(
        "{$fileName}.{$extension}",
        "{$fileName}_50x50.{$extension}",
        $originalImage
    );
    $this->crud->entry->save();
}

5. 测试验证

上传一张图片到elFinder,然后去public/uploads目录下检查,应该能看到原文件和两个带尺寸后缀的副本文件。

注意事项:

  • 确保public/uploads目录有写入权限,否则无法生成图片副本
  • 如果使用云存储(比如S3),需要调整回调里的存储逻辑,把生成的图片同步到云存储
  • 若不想裁剪图片,而是按比例缩放,可把fit()方法换成resize(),示例:resize(200, null, function ($constraint) { $constraint->aspectRatio(); })

内容的提问来源于stack exchange,提问作者Maya Hamdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:15:37