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
相关产品推荐
相关产品推荐

