mostafaznv/nova-larupload

此包已被 废弃 并不再维护。作者建议使用 mostafaznv/nova-file-artisan 包。

Laravel Nova 文件上传工具

2.3.0 2024-03-16 22:24 UTC

This package is auto-updated.

Last update: 2024-03-16 22:25:52 UTC


README

GitHub license Packagist Downloads Latest Version on Packagist

Nova File Artisan 是一个将 Larupload 与 Laravel Nova 集成的包。Larupload 是一个基于 ORM 的 Laravel 文件上传器,允许用户上传 图片视频音频 等已知文件格式。

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

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

演示

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

因此,如果您决定使用我的包,请考虑慷慨捐赠。无论金额大小,都将对您有很大帮助,并将受到高度赞赏。🍺

Donate

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

  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) 发布。