think.studio / laravel-simple-image-manager
一个简单包,用于上传图片时保存多种图片格式。
3.4.0
2023-07-15 11:15 UTC
Requires
- php: ^8.1
- illuminate/support: ^9.0|^10.0
- spatie/image: ^2.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.20
- orchestra/testbench: ^8.5
- phpunit/phpunit: ^10.2
- psalm/plugin-laravel: ^2.8
- vimeo/psalm: ^5.13
README
一个简单包,用于上传图片时保存多种图片格式。例如:
- myimage.png (原始)
- myimage-small.png
- myimage-thumb.png
- myimage-100x100.png
此包作为spatie/image包的包装器。因此,当您创建格式时,可以使用此包的所有方法。所有配置选项的描述可以在配置文件中找到。
安装
通过composer安装此包
composer require think.studio/laravel-simple-image-manager
您可以使用以下命令发布配置文件:
php artisan vendor:publish --provider="SimpleImageManager\ServiceProvider" --tag="config"
用法
上传文件示例
if ($request->hasFile('avatar')) { $user->avatar = SimpleImageManager::driver('avatars') ->upload( $request->file('avatar'), null /* or some name */, $user->avatar /* old file name to replace it */ ); } $user->save();
其他方法
// Get file url $url = SimpleImageManager::driver('avatars')->url((string) $user->avatar, $format); // Get file path $path = SimpleImageManager::driver('avatars')->path((string) $user->avatar, $format); // Delete specific format $isDeleted = SimpleImageManager::driver('avatars')->deleteSingle((string) $user->avatar, $format); // Delete all files if($isDeletedAll = SimpleImageManager::driver('avatars')->delete((string) $user->avatar)) { $user->avatar = null; }
高级用法
创建特定特质
- 创建特质
// app/Models/Traits/HasAvatar.php namespace App\Models\Traits; use Illuminate\Http\UploadedFile; use SimpleImageManager\Facades\SimpleImageManager; trait HasAvatar { /** * Driver name. * * @return string|null */ public function avatarManagerDriver(): ?string { if ( property_exists( $this, 'avatarManagerDriver' ) ) { return $this->avatarManagerDriver; } return null; } /** * Field key name. * * @return string */ public function avatarKey(): string { if ( property_exists( $this, 'avatarKey' ) ) { return $this->avatarKey; } return 'avatar'; } /** * Image manager. * * @return \SimpleImageManager\Contracts\ImageManagerInterface */ public function avatarManager(): \SimpleImageManager\Contracts\ImageManagerInterface { return SimpleImageManager::driver( $this->avatarManagerDriver() ); } /** * Upload file to storage. * * @param UploadedFile $image * @param string|null $filename * * @return string|null Storage file name. */ public function avatarUpload( UploadedFile $image, ?string $filename = null ): ?string { return $this->avatarManager() ->upload( $image, $filename, $this->{$this->avatarKey()} ); } /** * Delete file from storage. * * @return bool Storage file name. */ public function avatarDelete( bool $updateField = true, bool $persist = false ): bool { $result = $this->avatarManager()->delete( $this->{$this->avatarKey()} ); if ( $result && $updateField ) { $this->{$this->avatarKey()} = null; if ( $persist ) { $this->save(); } } return $result; } /** * Full path to file. * * @param string|null $format * * @return string|null */ public function avatarPath( ?string $format = null ): ?string { return $this->avatarManager()->path( (string) $this->{$this->avatarKey()}, $format ); } /** * File url. * * @param string|null $format * * @return string|null */ public function avatarUrl( ?string $format = null ): ?string { return $this->avatarManager()->url( (string) $this->{$this->avatarKey()}, $format ); } }
- 使用轨迹
class User //... { //... use HasAvatar; // ... protected string $avatarManagerDriver = 'avatars'; }
- 使用特质进行操作
if ($request->hasFile('avatar')) { $user->avatar = $user->avatarUpload( $request->file('avatar'), null /* or some name */ ); } $user->save(); $url = $user->avatarUrl();
使用内部特质
use Illuminate\Database\Eloquent\Model; use \SimpleImageManager\Eloquent\HasThinkImage; use \SimpleImageManager\Eloquent\ThinkImage; class Author extends Model { use HasThinkImage; /** @inerhitDoc */ public function thinkImagesMap(): array { return [ 'avatar' => (new ThinkImage('avatars', $this->avatar)) ->setDefaultUrl(url('/img/default.svg')), 'image' => 'feature-images', ]; } public function avatarImage(): ThinkImage { return $this->thinkImage('avatar'); } public function featureImage(): ThinkImage { return $this->thinkImage('image'); } }
然后您可以使用它
/** @var Author Author */ $author->featureImage()->img(); $author->avatarImage()->url(); $author->thinkImage('avatar')->path();
与laravel-nova一起使用
Avatar::make('Avatar', 'avatar') ->store( fn ($request, Model $model, $attribute, $requestAttribute, $storageDisk, $storageDir) => fn () => $model->fill([ $attribute => $model->avatarUpload($request->file($requestAttribute), $model->uuid), ])->save() )->maxWidth(100) ->preview(fn ($value, $storageDisk, $model) => $model->avatarUrl('small')) ->thumbnail(fn ($value, $storageDisk, $model) => $model->avatarUrl('small')) ->delete(fn ($request, $model, $storageDisk, $storagePath) => $model->avatarDelete()),