mostafaznv/nova-file-artisan

Laravel Nova 文件上传工具

2.3.0 2024-03-16 22:24 UTC

This package is auto-updated.

Last update: 2024-09-07 20:43:00 UTC


README

GitHub license Packagist Downloads Latest Version on Packagist

Nova File Artisan 是一个包,它集成了 Larupload 与 Laravel Nova。Larupload 是 Laravel 的文件上传器,基于 ORM,允许用户上传 图像视频音频 以及其他已知文件格式。

使用 Nova File Artisan,您可以利用两个包的功能,为您的 Laravel 项目创建一个管理面板。您可以在 Nova 资源中上传和显示各种类型的文件(如图像、视频、音频等)。您还可以使用 Larupload 的方法转换您的文件(如 缩放裁剪压缩 等)。您还可以使用 Larupload 的选项设置您的上传设置(如磁盘、路径、可见性等)。

Nova File Artisan 简单易用,支持多种文件系统(如本地、s3、sftp 等)。

演示

我正在开源之旅 🚀 上,我希望能够专注于我的开发路径,而不必担心我的财务状况。然而,生活并不完美,我必须考虑其他因素。

因此,如果您决定使用我的包,请考虑慷慨捐赠。无论金额大小,都将极大地帮助我,并衷心感谢。🍺

Donate

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 之前,请确保为每个模型创建附件。

  1. 使用 composer 安装包
composer require mostafaznv/nova-file-artisan
  1. 发布配置文件
php artisan vendor:publish --provider="Mostafaznv\NovaFileArtisan\NovaFileArtisanServiceProvider"
  1. 准备迁移和模型(更多信息请参阅 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)
                )
        ];
    }
}
  1. 准备 Nova 资源
<?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(),
        ];
    }
}

处理封面

封面会自动为视频图片生成,但您也可以选择上传自定义封面,适用于这些以及其他任何文件类型。

然而,可能有些情况下您需要在详情页隐藏封面,甚至从表单中移除封面上传器。您可以通过使用hideCoverFromDetailhideCoverUploader方法来实现这一点。

隐藏封面上传器

<?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 配置文件或文件实例中这样做。

我正在开源之旅 🚀 上,我希望能够专注于我的开发路径,而不必担心我的财务状况。然而,生活并不完美,我必须考虑其他因素。

因此,如果您决定使用我的包,请考虑慷慨捐赠。无论金额大小,都将极大地帮助我,并衷心感谢。🍺

Donate

演示

nova-file-artisan-1080p.mp4

许可

本软件根据MIT许可协议(MIT)发布。