mostafaznv / nova-file-artisan
Laravel Nova 文件上传工具
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 是 Laravel 的文件上传器,基于 ORM,允许用户上传 图像
、视频
、音频
以及其他已知文件格式。
使用 Nova File Artisan
,您可以利用两个包的功能,为您的 Laravel 项目创建一个管理面板。您可以在 Nova 资源中上传和显示各种类型的文件(如图像、视频、音频等)。您还可以使用 Larupload 的方法转换您的文件(如 缩放
、裁剪
、压缩
等)。您还可以使用 Larupload 的选项设置您的上传设置(如磁盘、路径、可见性等)。
Nova File Artisan 简单易用,支持多种文件系统(如本地、s3、sftp 等)。
我正在开源之旅 🚀 上,我希望能够专注于我的开发路径,而不必担心我的财务状况。然而,生活并不完美,我必须考虑其他因素。
因此,如果您决定使用我的包,请考虑慷慨捐赠。无论金额大小,都将极大地帮助我,并衷心感谢。🍺
Nova Artisan 字段的一些功能
- 以卓越的质量展示各种文件类型,如视频、音频和 HLS。
- 自动调整照片和视频的大小和裁剪。
- 自动为视频和图像创建多个尺寸。
- 支持从视频源创建和显示 HTTP Live Streaming (HLS)。
- 自动为视频文件生成封面图像。
- 可以为每个文件上传自定义封面。
- 内置图像优化支持。
- 提取图像宽度和高度。
- 提取视频宽度和持续时间。
- 提取音频持续时间。
- 从图像和视频中提取主色。
- 每个文件风格的下载按钮。
- 与各种存储驱动程序兼容。
- 通过队列系统进行视频处理。
- 准备与 REST API 集成。
- 所有 Larupload 功能在 Nova File Artisan 中均可访问。
需求
- 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)发布。