agenciafmd / admix-media
媒体 - Agência F&MD
dev-master
2023-08-04 13:51 UTC
Requires
- laravel/framework: ^8.0
- spatie/laravel-medialibrary: ^8.0
This package is auto-updated.
Last update: 2024-09-04 16:09:27 UTC
README
- 简化文件和图像上传
- 生成 pjpg 和 webp 格式的小图
安装
composer require agenciafmd/admix-media:dev-master
强烈建议安装这些应用程序。
sudo apt-get install jpegoptim
sudo apt-get install optipng
sudo apt-get install pngquant
sudo npm install -g svgo
sudo apt-get install gifsicle
sudo apt-get install webp
执行迁移
php artisan migrate
由于我们以 spatie/laravel-medialibrary 为基础,因此安装过程几乎相同。
use Agenciafmd\Media\Traits\MediaTrait; use Spatie\MediaLibrary\HasMedia; class YourModel extends Model implements HasMedia { use MediaTrait; protected $guarded = [ 'media', ]; }
配置
默认情况下,包的配置是
- 保持图像队列的缩放
- 优化所有图像为发送质量的 95%
- 使用包提供的视图进行图像渲染
如有需要,您可以自定义这些配置
php artisan vendor:publish --force --tag=admix-media:config
缩放
了解该包创建的缩略图将被用于我们的应用程序非常重要。要配置这些大小,需要在每个包中创建配置文件(upload-configs.php)。我知道这听起来很复杂,但实际上更容易。
return [ 'customer' => [ //nome da model em minusculo 'image' => [ //nome do campo em minusculo 'label' => 'imagem', //label do campo 'multiple' => false, //se permite o upload multiplo 'faker_dir' => false, #database_path('faker/customer/image'), 'sources' => [ [ 'conversion' => 'min-width-1366', 'media' => '(min-width: 1366px)', 'width' => 938, 'height' => 680, ], [ 'conversion' => 'min-width-1280', 'media' => '(min-width: 1280px)', 'width' => 776, 'height' => 565, ], ], // esta solução, permite mais de um campo na descrição da imagem // é muito util para galeria de imagens que possuem mais // de uma simples descrição, como no exemplo abaixo. // Lembrando que este item é opcional e deve ser // suprimido sempre que possivel. 'meta' => [ [ 'label' => 'tipo', 'name' => 'type', 'options' => [ 'Plantas Baixas', 'Implantações', ], ], [ 'label' => 'título', 'name' => 'title', ], [ 'label' => 'descrição', 'name' => 'description', 'textarea' => true, ], ], ], ], ];
数据生成器
配置数据生成器以接收图像
... $faker = Factory::create('pt_BR'); Category::factory($this->total) ->create() ->each(function ($category) use ($faker) { foreach (config('upload-configs.faqs-categories') as $key => $image) { $fakerDir = __DIR__ . '/../faker/faqs-categories/' . $key; if ($image['faker_dir']) { $fakerDir = $image['faker_dir']; } if ($image['multiple']) { $items = $faker->numberBetween(0, 6); for ($i = 0; $i < $items; $i++) { $category->doUploadMultiple($faker->file($fakerDir, storage_path('admix/tmp')), $key); } } else { $category->doUpload($faker->file($fakerDir, storage_path('admix/tmp')), $key); } } $category->save(); $this->command->getOutput() ->progressAdvance(); });
Admix
为了在我们的包中放置上传字段,我们将前往 form.blade.php
。按照惯例,在多文件上传时,我们将保持字段名称的单数形式。
{{ Form::bsImage('Imagem', 'image', $model) }} {{ Form::bsImages('Imagens', 'images', $model) }} {{ Form::bsMedia('Arquivo', 'file', $model) }} {{ Form::bsMedias('Arquivos', 'files', $model) }}
或者“延迟”模式,其中 user
是我们的 model
名称的小写
@foreach(config('upload-configs.user') as $field => $upload) @if($upload['multiple']) {{ Form::bsImages($upload['label'], $field, $model) }} @else {{ Form::bsImage($upload['label'], $field, $model) }} @endif @endforeach
我们不要忘记我们亲爱的 Request
class YourRequest extends FormRequest { public function rules() { return [ 'media' => [ 'array', 'nullable', ], ]; } }
前端
由于我们的一个想法是优化显示图像的过程,因此包中提供了一些便利。
例如
{{ $model->picture('image') }}
<picture> <source media="(min-width: 1366px)" srcset="/storage/81/conversions/irineu-junior-200810171044000-min-width-1366-webp.webp, /storage/81/conversions/irineu-junior-200810171044000-min-width-1366-webp@2x.webp 2x"> <source media="(min-width: 1366px)" srcset="/storage/81/conversions/irineu-junior-200810171044000-min-width-1366.jpg, /storage/81/conversions/irineu-junior-200810171044000-min-width-1366@2x.jpg 2x"> <source media="(min-width: 1280px)" srcset="/storage/81/conversions/irineu-junior-200810171044000-min-width-1280-webp.webp, /storage/81/conversions/irineu-junior-200810171044000-min-width-1280-webp@2x.webp 2x"> <source media="(min-width: 1280px)" srcset="/storage/81/conversions/irineu-junior-200810171044000-min-width-1280.jpg, /storage/81/conversions/irineu-junior-200810171044000-min-width-1280@2x.jpg 2x"> <img src="data:image/png;base64, R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" loading="lazy" class="img-fluid" title="irineu-junior-200810171044000.jpg" alt="irineu-junior-200810171044000.jpg"></picture>
@foreach($model->fancyPictures() as $picture) {{ $picture }} @endforeach
<a href="/storage/82/irineu-junior-200810171121000.jpg" data-fancybox="images" data-caption="irineu-junior-200810171121000.jpg" class=""> <picture> <source media="(min-width: 1366px)" srcset="/storage/82/conversions/irineu-junior-200810171121000-min-width-1366-webp.webp, /storage/82/conversions/irineu-junior-200810171121000-min-width-1366-webp@2x.webp 2x"> <source media="(min-width: 1366px)" srcset="/storage/82/conversions/irineu-junior-200810171121000-min-width-1366.jpg, /storage/82/conversions/irineu-junior-200810171121000-min-width-1366@2x.jpg 2x"> <source media="(min-width: 1280px)" srcset="/storage/82/conversions/irineu-junior-200810171121000-min-width-1280-webp.webp, /storage/82/conversions/irineu-junior-200810171121000-min-width-1280-webp@2x.webp 2x"> <source media="(min-width: 1280px)" srcset="/storage/82/conversions/irineu-junior-200810171121000-min-width-1280.jpg, /storage/82/conversions/irineu-junior-200810171121000-min-width-1280@2x.jpg 2x"> <img src="data:image/png;base64, R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" loading="lazy" class="img-fluid" title="irineu-junior-200810171121000.jpg" alt="irineu-junior-200810171121000.jpg"></picture></a> <a href="/storage/83/irineu-junior-200810171123000.jpg" data-fancybox="images" data-caption="irineu-junior-200810171123000.jpg" class=""> <picture> <source media="(min-width: 1366px)" srcset="/storage/83/conversions/irineu-junior-200810171123000-min-width-1366-webp.webp, /storage/83/conversions/irineu-junior-200810171123000-min-width-1366-webp@2x.webp 2x"> <source media="(min-width: 1366px)" srcset="/storage/83/conversions/irineu-junior-200810171123000-min-width-1366.jpg, /storage/83/conversions/irineu-junior-200810171123000-min-width-1366@2x.jpg 2x"> <source media="(min-width: 1280px)" srcset="/storage/83/conversions/irineu-junior-200810171123000-min-width-1280-webp.webp, /storage/83/conversions/irineu-junior-200810171123000-min-width-1280-webp@2x.webp 2x"> <source media="(min-width: 1280px)" srcset="/storage/83/conversions/irineu-junior-200810171123000-min-width-1280.jpg, /storage/83/conversions/irineu-junior-200810171123000-min-width-1280@2x.jpg 2x"> <img src="data:image/png;base64, R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" loading="lazy" class="img-fluid" title="irineu-junior-200810171123000.jpg" alt="irineu-junior-200810171123000.jpg"></picture></a>
{{ $model->file() }}
/storage/90/irineu-junior-200811140054000.zip
自定义视图
可能需要自定义渲染的视图。为此,将它们(fancy-picture.blade.php / picture.blade.php)复制到 packages/frontend/src/resources/views/media
,并在 config/admix-media.php
的字段中调用它们
return [ ... 'picture_view' => 'agenciafmd/frontend::media.picture', 'fancy_picture_view' => 'agenciafmd/media::media.fancy-picture', ];
许可证
我们的包是开源的,对更亲近的人是 MIT 许可。
请随意开始构建您的应用程序,但请记住,成功与否的责任不在我们😊。