dieter-vanhove / advanced-nova-media-library

Laravel Nova 管理Spatie媒体库的工具。

v1.0.00 2024-01-09 19:17 UTC

This package is auto-updated.

Last update: 2024-09-09 20:45:58 UTC


README

管理spatie的媒体库包中的图片。通过拖放上传多个图片并排序。

目录

示例

Cropping Single image upload Multiple image upload Custom properties Generic file management

安装

composer require ebess/advanced-nova-media-library
php artisan vendor:publish --tag=nova-media-library

模型媒体配置

假设您已将模型配置为如下使用媒体库:

use Spatie\MediaLibrary\MediaCollections\Models\Media;

public function registerMediaConversions(Media $media = null): void
{
    $this->addMediaConversion('thumb')
        ->width(130)
        ->height(130);
}

public function registerMediaCollections(): void
{
    $this->addMediaCollection('main')->singleFile();
    $this->addMediaCollection('my_multi_collection');
}

通用文件管理

Generic file management

为了能够上传和处理通用文件,只需使用Files字段即可。

use Ebess\AdvancedNovaMediaLibrary\Fields\Files;

Files::make('Single file', 'one_file'),
Files::make('Multiple files', 'multiple_files'),

单张图片上传

Single image upload

use Ebess\AdvancedNovaMediaLibrary\Fields\Images;

public function fields(Request $request)
{
    return [
        Images::make('Main image', 'main') // second parameter is the media collection name
            ->conversionOnIndexView('thumb') // conversion used to display the image
            ->rules('required'), // validation rules
    ];
}

多张图片上传

如果您启用了多文件上传功能,您可以通过拖放来排序图片

Multiple image upload

use Ebess\AdvancedNovaMediaLibrary\Fields\Images;

public function fields(Request $request)
{
    return [
        Images::make('Images', 'my_multi_collection') // second parameter is the media collection name
            ->conversionOnPreview('medium-size') // conversion used to display the "original" image
            ->conversionOnDetailView('thumb') // conversion used on the model's view
            ->conversionOnIndexView('thumb') // conversion used to display the image on the model's index page
            ->conversionOnForm('thumb') // conversion used to display the image on the model's form
            ->fullSize() // full size column
            ->rules('required', 'size:3') // validation rules for the collection of images
            // validation rules for the collection of images
            ->singleImageRules('dimensions:min_width=100'),
    ];
}

选择现有媒体

Selecting existing media Selecting existing media 2

如果您将相同的媒体文件上传到多个模型,并且您不想再次从文件系统中选择它,请使用此功能。选择已存在的媒体将复制它

注意:此功能会将一个端点暴露给您的应用程序的每个用户来搜索现有媒体。如果您的媒体上传或媒体模型的自定义属性是机密的,请不要启用此功能!

  • 如果您还没有,请发布配置文件
artisan vendor:publish --tag=nova-media-library
  • 在配置文件config/nova-media-library中启用此功能
return [
    'enable-existing-media' => true,
];
  • 启用现有媒体字段的选取
Images::make('Image')->enableExistingMedia(),

注意:此功能不支持临时URL。

上传图片的名称

新上传文件的默认文件名是原始文件名。您可以使用setFileName函数来更改它,该函数接受一个回调函数作为唯一参数。此回调函数有三个参数:$originalFilename(原始文件名,例如Fotolia 4711.jpg)、$extension(文件扩展名,例如jpg)、$model(当前模型)。以下仅是您可以做的两个示例

// Set the filename to the MD5 Hash of original filename
Images::make('Image 1', 'img1')
    ->setFileName(function($originalFilename, $extension, $model){
        return md5($originalFilename) . '.' . $extension;
    });

// Set the filename to the model name
Images::make('Image 2', 'img2')
    ->setFileName(function($originalFilename, $extension, $model){
        return str_slug($model->name) . '.' . $extension;
    });

默认情况下,Media对象上的“name”字段设置为不带扩展名的原始文件名。要更改此设置,您可以使用setName函数。与上述setFileName一样,它接受一个回调函数作为唯一参数。此回调函数有两个参数:$originalFilename$model

Images::make('Image 1', 'img1')
    ->setName(function($originalFilename, $model){
        return md5($originalFilename);
    });

响应式图片

如果您想使用来自Spatie MediaLibrary的响应式图片功能,您可以在模型上使用withResponsiveImages()函数。

Images::make('Image 1', 'img1')
    ->withResponsiveImages();

图片裁剪

Cropping

默认情况下,您可以通过在编辑视图的左下角点击剪刀来裁剪/旋转图片。此功能使用vue-js-clipper实现。裁剪功能限于image/jpgimage/jpegimage/png的MIME类型。

重要:通过裁剪现有图片,原始媒体模型将被删除,并由裁剪后的图片替换。所有自定义属性都会从旧模型复制到新模型。

要禁用此功能,请使用croppable方法

Images::make('Gallery')->croppable(false);

您可以将所有配置,例如比例等,设置为以下格式

Images::make('Gallery')->croppingConfigs(['aspectRatio' => 4/3]);

可用的裁剪配置,请参阅https://github.com/timtnleeProject/vuejs-clipper#clipper-basic

可以在上传时强制裁剪,例如确保图像具有设置的宽高比

Images::make('Gallery')->mustCrop();

默认禁用裁剪

默认情况下,裁剪功能已启用。要为所有图片默认禁用裁剪,请在 config/nova-media-library.php 中将 default-croppable 设置为 false

return [
    'default-croppable' => false,
];

自定义属性

Custom properties

Images::make('Gallery')
    ->customPropertiesFields([
        Boolean::make('Active'),
        Markdown::make('Description'),
    ]);
    
Files::make('Multiple files', 'multiple_files')
    ->customPropertiesFields([
        Boolean::make('Active'),
        Markdown::make('Description'),
    ]);
    
// custom properties without user input
Files::make('Multiple files', 'multiple_files')
    ->customProperties([
        'foo' => auth()->user()->foo,
        'bar' => $api->getNeededData(),
    ]);

显示图片统计信息 (大小、尺寸、类型)

Image statistics

Images::make('Gallery')
    ->showStatistics();

自定义头信息

Images::make('Gallery')
    ->customHeaders([
        'header-name' => 'header-value', 
    ]);

媒体字段(视频)

为了处理带有缩略图的视频,您需要使用 Media 字段而不是 Images。这样,您也可以上传视频。

use Ebess\AdvancedNovaMediaLibrary\Fields\Media;

class Category extends Resource
{
    public function fields(Request $request)
    {
        Media::make('Gallery') // media handles videos
            ->conversionOnIndexView('thumb')
            ->singleMediaRules('max:5000'); // max 5000kb
    }
}

// ..

class YourModel extends Model implements HasMedia
{
    public function registerMediaConversions(Media $media = null): void
    {
        $this->addMediaConversion('thumb')
            ->width(368)
            ->height(232)
            ->extractVideoFrameAtSecond(1);
    }
}

临时URL

如果您使用 Amazon S3 来存储媒体,您需要在您的字段上使用 temporary 函数来生成一个临时签名URL。此函数期望一个有效的 Carbon 实例,该实例将指定 URL 应何时过期。

Images::make('Image 1', 'img1')
    ->temporary(now()->addMinutes(5))

Files::make('Multiple files', 'multiple_files')
    ->temporary(now()->addMinutes(10),

注意:此功能与现有媒体功能不兼容。

致谢

替代方案

变更日志

v4.0.2 - 2022-04-26

  • 修复 Nova 4 中的裁剪比例。现在,从 Images::( ... )>croppingConfigs() 配置传递到裁剪器的 stencil-props 属性。有关可用的属性详情,请参阅 裁剪器文档

v4.0.1 - 2022-04-20

  • 修复详细信息组件
  • 修复布局不一致问题

v4.0.0 - 2022-04-18

  • 升级以支持 Laravel Nova 4
  • 与 Laravel Nova 1、2 和 3 不兼容。对于这些 nova 版本,请使用 v3.*
  • vuejs-clipper 替换为 vue-advanced-cropper 以支持 vue3

完整的变更日志请查看 PR #317

如何贡献

  • 当然,您需要在 Laravel 应用中安装 Nova
  • vendor 目录中的包内直接工作(webpack 需要 Nova 已安装)
  • 然后从 vendor/xxx/advanced-nova-media-library 目录
    • 至少使用 nvm use 14
    • 运行 yarn install
    • 运行 yarn run watch
    • 努力工作 🤘
    • 工作完成后,运行 yarn npm production
    • 创建一个 PR