Laravel ImageUp 自动上传,调整图像大小和裁剪图像功能

卜季萌
2023-12-01

Laravel ImageUp

qcod/laravel-imageup 是一个可让您通过大量自定义功能自动上传,调整图像大小和裁剪图像功能。

安装

您可以通过composer安装该软件包:

$ composer require qcod/laravel-imageup

软件包将自动注册。如果需要手动注册,可以通过将其添加到config/app.phpproviders数组中来进行注册:

QCod\ImageUp\ImageUpServiceProvider::class

您可以选择使用以下方式发布配置文件:

php artisan vendor:publish --provider="QCod\ImageUp\ImageUpServiceProvider" --tag="config"

它将config/imageup.php使用所有设置进行创建。

入门

您只需添加use HasImageUploadsEloquent模型并定义所有需要在数据库中存储图像的字段。

模型

<?php
namespace App;

use QCod\ImageUp\HasImageUploads;
use Illuminate\Database\Eloquent\Model;

class User extends Model {
    use HasImageUploads;
    
    //假设用户表有'cover','avatar'列
    //将所有列标记
    protected static $imageFields = [
        'cover', 'avatar'
    ];
}

标记了模型中的所有图像字段后,只要您通过挂接Model::saved()事件保存模型,它将自动上载图像。它还将使用新存储的文件路径更新数据库,如果找到旧图像,则在上载新图像后将其删除。

数据库表中的图像字段应与VARCHAR,以存储上载图像的路径。

在控制器中

<?php
namespace App;
use App\Http\Controllers\Controller;

class UserController extends Controller {
    public function store(Request $request){
        return User::create($request->all());
    }
}

确保运行php artisan storage:link来使用公共存储磁盘中的图像

通过上述设置,当您使用发布请求命中存储方法时,如果request()上存在coveravatar命名的文件,它将被自动上传。

上传选项

ImageUp为您提供了大量自定义功能,可根据定义的字段选项处理上传和调整大小的方式,以下是您可以自定义的内容:

<?php
namespace App;

use QCod\ImageUp\HasImageUploads;
use Illuminate\Database\Eloquent\Model;

class User extends Model {
    
    use HasImageUploads;
    
    //选择哪一个磁盘用于上传,可以覆盖 
    protected $imagesUploadDisk = 'local';
    
    //在盘使用上传路径,可以覆盖 
    protected $imagesUploadPath = 'uploads';
    
    //自动上传允许
    protected $autoUploadImages = true;
    
    // 所有选择的图像上传字段
    protected static $imageFields = [
        'avatar' => [
            // 上传后要调整图像大小
            'width' => 200,
            
            // 上传后调整图片大小的高度
            'height' => 100,
            
            // 将true设置为具有给定宽度/高度的裁剪图像,还可以为裁剪传递arr [x,y]坐标。
            'crop' => true,
            
            // 您要上传的磁盘,默认config('imageup.upload_disk')
            'disk' => 'public',
            
            // 上传磁盘上的文件夹路径,默认为config('imageup.upload_directory')
            'path' => 'avatars',
            
            // 如果图像字段为空,则为占位符图像
            'placeholder' => '/images/avatar-placeholder.svg',
            
            // 上传图片时的图片验证规则
            'rules' => 'image|max:2000',
            
            // 是否覆盖全局自动上传设置(“imageup.auto_upload_images”)
            'auto_upload' => false,
            
            // 如果请求文件的名称不同,则默认值为字段名称
            'file_input' => 'photo',
            
            // 在文件保存之前触发的钩子
            'before_save' => BlurFilter::class,
            
            // 保存文件后触发的钩子
            'after_save' => CreateWatermarkImage::class
        ],
        'cover' => [
            //...    
        ]
    ];
    
    // any other than image file type for upload
    protected static $fileFields = [
            'resume' => [
                // 您要上传的磁盘,默认config('imageup.upload_disk')
                'disk' => 'public',
                
                // 上传磁盘上的文件夹路径,默认为config('imageup.upload_directory')
                'path' => 'docs',
                
                // 上传图片时的图片验证规则
                'rules' => 'mimes:doc,pdf,docx|max:1000',
                
                // 覆盖全局自动上传设置(“imageup.auto_upload_images”)
                'auto_upload' => false,
                
                // 如果请求文件的名称不同,则默认值为字段名称
                'file_input' => 'cv',
                
                // 在文件保存之前触发的钩子
                'before_save' => HookForBeforeSave::class,
                
                // 保存文件后触发的钩子
                'after_save' => HookForAfterSave::class
            ],
            'cover_letter' => [
                //...    
            ]
        ];
}

自定义文件名

在某些情况下,您将需要自定义保存的文件名。默认情况下,它将$file->hashName()生成哈希值。

您可以通过在模型上添加具有{fieldName}UploadFilePath命名约定的方法来做到这一点:

class User extends Model {
    use HasImageUploads;
    
    // assuming `users` table has 'cover', 'avatar' columns
    // mark all the columns as image fields 
    protected static $imageFields = [
        'cover', 'avatar'
    ];
    
    // override cover file name
    protected function coverUploadFilePath($file) {
        return $this->id . '-cover-image.jpg';
    }
}

上方将始终将上传的封面图片另存为uploads/1-cover-image.jpg

确保仅从覆盖方法返回相对路径。

请求文件将通过$file此方法作为参数传递,因此您可以获取扩展名或原始文件名等来构建文件名。

    // override cover file name
    protected function coverUploadFilePath($file) {
        return $this->id .'-'. $file->getClientOriginalName();
    }
    
    /** Some of methods on file */
    // $file->getClientOriginalExtension()
    // $file->getRealPath()
    // $file->getSize()
    // $file->getMimeType()

可用方法

您不仅能使用自动上传图像功能。还为您提供以下方法,您可以使用这些方法来手动上载图像并调整其大小。

**注意:**请确保已通过设置protected $autoUploadImages = false; 模型或通过调用动态禁用了自动上传$model->disableAutoUpload()。您也可以通过调用来$model->setImagesField(['cover' => ['auto_upload' => false]); 将其禁用以用于指定字段,否则您将看不到您的手动上传,因为在保存模型时会被自动上传覆盖。

$ model-> uploadImage($ imageFile,$ field = null)/ $ model-> uploadFile($ docFile,$ field = null)

为给定的$ field上传图像/文件,如果$ field为null,它将上传到数组中定义的第一个图像/文件选项。

$user = User::findOrFail($id);
$user->uploadImage(request()->file('cover'), 'cover');
$user->uploadFile(request()->file('resume'), 'resume');

m o d e l − > s e t I m a g e s F i e l d ( model->setImagesField( model>setImagesField(fieldsOptions) / m o d e l − > s e t F i l e s F i e l d ( model->setFilesField( model>setFilesField(fieldsOptions)

您还可以通过$model->setImagesField($fieldsOptions) / $model->setFilesField($fieldsOptions)使用字段选项进行调用来动态设置图像/文件字段,它将替换在模型属性上定义的字段。

$user = User::findOrFail($id);

$fieldOptions = [
    'cover' => [ 'width' => 1000 ],
    'avatar' => [ 'width' => 120, 'crop' => true ],    
];

// 放大图片
$user->setImagesField($fieldOptions);

$fileFieldOption = [
    'resume' => ['path' => 'resumes']
];

// 修改上传磁盘上的文件夹路径
$user->setFilesField($fileFieldOption);

m o d e l − > h a s I m a g e F i e l d ( model->hasImageField( model>hasImageField(field) / m o d e l − > h a s F i l e F i e l d ( model->hasFileField( model>hasFileField(field)

检查字段是否定义为图像/文件字段。

m o d e l − > d e l e t e I m a g e ( model->deleteImage( model>deleteImage(filePath) / m o d e l − > d e l e t e F i l e ( model->deleteFile( model>deleteFile(filePath)

删除任何图像/文件(如果存在)。

m o d e l − > r e s i z e I m a g e ( model->resizeImage( model>resizeImage(imageFile, $fieldOptions)

如果已经有图像,则可以使用与图像字段相同的选项来调用此方法以调整其大小。

$user = User::findOrFail($id);

//调整图片大小,它将为您提供调整大小的图片,您需要保存它
$imageFile = '/images/some-big-image.jpg';
$image = $user->resizeImage($imageFile, [ 'width' => 120, 'crop' => true ]);

// 您可以使用上传的文件
$imageFile = request()->file('avatar');
$image = $user->resizeImage($imageFile, [ 'width' => 120, 'crop' => true ]);

m o d e l − > c r o p T o ( model->cropTo( model>cropTo(x, y ) − > r e s i z e I m a g e ( y)->resizeImage( y)>resizeImage(imageFile, $field = null)

您可以使用此cropTo()方法设置裁剪的x和y坐标。如果要从某种字体结束的图像裁剪库中获取坐标,这将非常有用。

$user = User::findOrFail($id);

// 请求文件
$imageFile = request()->file('avatar');

// 请求文件并剪裁到坐标
$coords = request()->only(['crop_x', 'crop_y']);

// 修改文件宽度
$image = $user->cropTo($coords)
    ->resizeImage($imageFile, [ 'width' => 120, 'crop' => true ]);

// 覆盖剪裁到配置
$user->cropTo($coords)
    ->uploadImage(request()->file('cover'), 'avatar');

m o d e l − > i m a g e U r l ( model->imageUrl( model>imageUrl(field) / m o d e l − > f i l e U r l ( model->fileUrl( model>fileUrl(field)

提供给定图像/文件字段的上传文件网址。

$user = User::findOrFail($id);

// 在你的视图中
<img src="{{ $user->imageUrl('cover') }}" alt="" />
// http://www.example.com/storage/uploads/iGqUEbCPTv7EuqkndE34CNitlJbFhuxEWmgN9JIh.jpeg

m o d e l − > i m a g e T a g ( model->imageTag( model>imageTag(field, $attribute = ‘’)

它为您<img />提供了字段的标签。

{!! $model->imageTag('avatar') !!}
<!-- <img src="http://www.example.com/storage/uploads/iGqUEbCPTv7EuqkndE34CNitlJbFhuxEWmgN9JIh.jpeg" /> -->

{!! $model->imageTag('avatar', 'class="float-left mr-3"') !!}
<!-- <img src="http://www.example.com/storage/uploads/iGqUEbCPTv7EuqkndE34CNitlJbFhuxEWmgN9JIh.jpeg" class="float-left mr-3 /> -->

钩子

挂钩允许您在保存图像之前或之后进行的任何其他逻辑。

定义类型

您可以通过指定类名来定义钩子

protected static $imageFields = [
    'avatar' => [
        'before_save' => BlurFilter::class,
    ],
    'cover' => [
        //...    
    ]
];

挂钩类必须具有一个名为的方法handle,该方法将在触发挂钩时被调用。干预图像的实例将传递给该handle方法。

class BlurFilter {
    public function handle($image) {
        $image->blur(10); //模糊10,具体支持ide自动出来自己看吧
    }
}

通过laravel ioc容器解析基于类的钩子,该容器允许您通过构造函数注入任何依赖项。

请注意,如果您使用或定义了字段选项,则将在其中调整大小的图像beforeafter保存钩子处理程序。当然,您可以随时获取原始图像。width``height``request()->file('avatar')

定义第二种类型是回调挂钩。

$user->setImagesField([
    'avatar' => [
        'before_save' => function($image) {
            $image->blur(10);
        },
    ],
    'cover' => [
        //...    
    ]
]);

回调还将接收干预图像实例参数。

钩子类型

钩子abefore_save(图片存储前)和after_save(图片存储后)钩子有两种类型。

before_save在将映像保存到磁盘之前,将调用该挂钩。对挂钩内的干预所做的任何更改都将应用于保存的图像。

$user->setImagesField([
    'avatar' => [
        'width' => 100,
        'height' => 100,
        'before_save' => function($image) {
            // 修改图片大小
            $image->resize(50, 50);
        },
    ]
]);

after_save在将映像保存到磁盘之后立即调用该挂钩。

$user->setImagesField([
    'logo' => [
        'after_save' => function($image) {
            // 创建水印
        },
    ]
]);

配置文件

<?php

return [

    /**
     * 保存磁盘
     */
    'upload_disk' => 'public',

    /**
     * 保存目录
     */
    'upload_directory' => 'uploads',

    /**
     * 是否自动上传
     */
    'auto_upload_images' => true,

    /**
     * 数据库中记录被删除,自动删除图片
     */
    'auto_delete_images' => true,

    /**
     * 设置图像质量
     */
    'resize_image_quality' => 80
];

下载地址

https://github.com/qcod/laravel-imageup

 类似资料: