mostafaznv / nova-larupload
Requires
- php: ^8.2
- ext-json: *
- laravel/framework: ^10.4.1|^11.0
- laravel/nova: ^4.27
- mostafaznv/larupload: ^1.0.5|^2.0.0
- nova-kit/nova-packages-tool: ^v1.13.3
README
Nova File Artisan 是一个将 Larupload 与 Laravel Nova 集成的包。Larupload 是一个基于 ORM 的 Laravel 文件上传器,允许用户上传 图片
、视频
、音频
等已知文件格式。
使用 Nova File Artisan
,您可以使用两个包的功能来创建 Laravel 项目的管理面板。您可以在 Nova 资源中上传和显示各种类型的文件(如图片、视频、音频等)。您还可以使用 Larupload 的方法转换您的文件(如 调整大小
、裁剪
、压缩
等)。您还可以使用 Larupload 的选项设置您的上传设置(如磁盘、路径、可见性等)。
Nova File Artisan 简单易用,并支持多种文件系统(如本地、s3、sftp 等)。
我正在开启开源之旅 🚀,我希望能够专注于我的开发道路,而不必担心我的财务状况。然而,生活并非完美,我必须考虑其他因素。
因此,如果您决定使用我的包,请考虑慷慨捐赠。无论金额大小,都将对您有很大帮助,并将受到高度赞赏。🍺
Nova Artisan 字段的一些功能
- 以卓越的品质显示各种文件类型,如视频、音频和 HLS。
- 自动调整照片和视频的大小和裁剪。
- 自动为视频和图像创建多个尺寸。
- 支持从视频源创建和显示 HTTP Live Streaming(HLS)。
- 自动为视频文件生成封面图片。
- 为每个文件上传自定义封面。
- 内置图像优化支持。
- 提取图像宽度和高度。
- 提取视频宽度和高度以及持续时间。
- 提取音频持续时间。
- 从图像和视频中提取主导颜色。
- 为每个文件样式提供下载按钮。
- 与各种存储驱动程序兼容。
- 通过队列系统进行视频处理。
- 准备好与 REST API 集成。
- Nova File Artisan 中可访问所有 Larupload 功能。
要求
- PHP 8.2 或更高版本
- Larupload 1.0.4 或更高版本
- Laravel 10.4.1 或更高版本
- Nova 4.27 或更高版本
安装和使用
注意
请确保您已在 Laravel 应用程序中安装并配置了 Larupload 包。如果您还没有这样做,请参阅 Larupload 的 文档 以获取有关安装和使用的说明。在继续使用 Nova File Artisan 之前,请务必为每个模型创建附件。
composer require mostafaznv/nova-file-artisan
php artisan vendor:publish --provider="Mostafaznv\NovaFileArtisan\NovaFileArtisanServiceProvider"
-
准备迁移和模型(有关更多信息,请参阅 Larupload 文档)
迁移
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; use Mostafaznv\Larupload\Enums\LaruploadMode; return new class extends Migration { public function up(): void { Schema::create('attachments', function (Blueprint $table) { $table->id(); $table->string('title')->nullable(); $table->upload('main_file', LaruploadMode::HEAVY); $table->timestamps(); }); } public function down(): void { Schema::dropIfExists('attachments'); } };
模型
<?php namespace App\Models; use FFMpeg\Format\Video\X264; use Illuminate\Database\Eloquent\Model; use Mostafaznv\Larupload\Enums\LaruploadMediaStyle; use Mostafaznv\Larupload\Enums\LaruploadMode; use Mostafaznv\Larupload\Traits\Larupload; use Mostafaznv\Larupload\Storage\Attachment as LaruploadAttachment; class Attachment extends Model { use Larupload; public function attachments(): array { return [ LaruploadAttachment::make('main_file') ->image('thumbnail', 640, 480) ->image('retina', 1280, 960) ->video('SD', 640, 480) ->video('HD', 1920, 1080) ->stream( name: '480p', width: 640, height: 480, format: (new X264) ->setKiloBitrate(1000) ->setAudioKiloBitrate(32) ) ->stream( name: '720p', width: 1280, height: 720, format: (new X264) ->setKiloBitrate(3000) ->setAudioKiloBitrate(64) ) ]; } }
<?php namespace App\Nova; use Laravel\Nova\Fields\ID; use Laravel\Nova\Fields\Text; use Laravel\Nova\Http\Requests\NovaRequest; use App\Models\Attachment as Model; use Mostafaznv\NovaFileArtisan\Fields\NovaFileArtisan; class Attachment extends Resource { public static string $model = Model::class; public static $title = 'title'; public function fields(NovaRequest $request): array { return [ ID::make()->sortable(), Text::make('Title')->rules('required', 'max:255'), NovaFileArtisan::make('Main File', 'main_file'), ]; } }
这就完成了,你可以开始使用了!
获取附件元数据
您可以使用 NovaFileArtisanMeta
字段打印从您的文件中提取的元数据。这个字段是只读字段,仅用于显示元数据。
<?php namespace App\Nova; use Laravel\Nova\Fields\ID; use Laravel\Nova\Fields\Text; use Laravel\Nova\Http\Requests\NovaRequest; use App\Models\Attachment as Model; use Mostafaznv\NovaFileArtisan\Fields\NovaFileArtisan; use Mostafaznv\NovaFileArtisan\Fields\NovaFileArtisanMeta; class Attachment extends Resource { public static string $model = Model::class; public static $title = 'title'; public function fields(NovaRequest $request): array { return [ ID::make()->sortable(), Text::make('Title')->rules('required', 'max:255'), NovaFileArtisan::make('Main File', 'main_file'), // print all metadata ...NovaFileArtisanMeta::make('main_file')->all(), // or print specific metadata NovaFileArtisanMeta::make('main_file')->fileName(), NovaFileArtisanMeta::make('main_file')->size(), NovaFileArtisanMeta::make('main_file')->mimeType(), NovaFileArtisanMeta::make('main_file')->width(), NovaFileArtisanMeta::make('main_file')->height(), NovaFileArtisanMeta::make('main_file')->duration(), NovaFileArtisanMeta::make('main_file')->format(), ]; } }
处理封面
封面会自动为 视频
和 图片
生成,但您也可以选择上传自定义封面,适用于这些以及其他任何文件类型。
然而,可能存在您需要在详情页隐藏封面甚至从表单中移除封面的情况。您可以通过使用 hideCoverFromDetail
和 hideCoverUploader
方法实现这一点。
隐藏封面上传器
<?php namespace App\Nova; use Laravel\Nova\Fields\ID; use Laravel\Nova\Http\Requests\NovaRequest; use App\Models\Attachment as Model; use Mostafaznv\NovaFileArtisan\Fields\NovaFileArtisan; class Attachment extends Resource { public static string $model = Model::class; public function fields(NovaRequest $request): array { return [ ID::make()->sortable(), NovaFileArtisan::make('Main File', 'main_file') ->hideCoverUploader(), ]; } }
从详情页隐藏封面
<?php namespace App\Nova; use Laravel\Nova\Fields\ID; use Laravel\Nova\Http\Requests\NovaRequest; use App\Models\Attachment as Model; use Mostafaznv\NovaFileArtisan\Fields\NovaFileArtisan; class Attachment extends Resource { public static string $model = Model::class; public function fields(NovaRequest $request): array { return [ ID::make()->sortable(), NovaFileArtisan::make('Main File', 'main_file') ->hideCoverFromDetail(), // or you can hide cover from detail based on condition NovaFileArtisan::make('Main File', 'main_file') ->hideCoverFromDetail( fn (NovaRequest $request) => $request->resourceId == 34 ), ]; } }
注意
修剪文件
Nova的 prunable
方法与 NovaFileArtisan
字段不符合预期工作。正如您可能知道的,在 Larupload
中,有一个选项可以打开/关闭 preserve-files
。此选项用于防止当从数据库中删除模型时文件被删除,并且与预期的 prunable
方法的行为相一致。因此,如果您想在删除模型时保留文件,应将 preserve-files
设置为 true
。您可以在您的 Larupload 配置文件 或文件 附件实例 中这样做。
我正在开启开源之旅 🚀,我希望能够专注于我的开发道路,而不必担心我的财务状况。然而,生活并非完美,我必须考虑其他因素。
因此,如果您决定使用我的包,请考虑慷慨捐赠。无论金额大小,都将对您有很大帮助,并将受到高度赞赏。🍺
演示
nova-file-artisan-1080p.mp4
许可
本软件根据 MIT许可证(MIT) 发布。