为 Laravel-admin 的 Form 控件做一个大文件上传的扩展包

注:阅读本文需要了解模型表单的自定义工具laravel-admin扩展开发;本文的扩展包是基于peinhu的AetherUpload-laravel大文件上传包的一个整合方案。

1,生成扩展包骨架:

php artisan admin:extend laravel-admin-ext/large-file-upload --namespace=Encore\\LargeFileUpload

2,composer.json的配置修改不再赘述,移除不必要的文件目录,并新建LargeFileField.php文件,精简后如图
file
说明:
assets文件夹存放需要发布的静态文件js,css等等
views目录存放需要用到的blade模板视图文件
src目录存放具体的逻辑文件
3,修改LargeFileUpload.php

<?php

namespace Encore\LargeFileUpload;

use Encore\Admin\Extension;

class LargeFileUpload extends Extension
{
   //扩展名称
    public $name = 'large-file-upload';
   //扩展视图目录
    public $views = __DIR__.'/../resources/views'; 
   //扩展静态文件目录
    public $assets = __DIR__.'/../resources/assets';
}

4,我们把需要用的js或css脚本放到assets目录下,将视图放到views目录下,如图:
file
5,修改LargeFileUploadServiceProvider.php

    public function boot(LargeFileUpload $extension)
    {
        if (! LargeFileUpload::boot()) {
            return ;
        }
        //静态文件的发布目录
        if ($this->app->runningInConsole() && $assets = $extension->assets()) {
            $this->publishes(
                [$assets => public_path('vendor/laravel-admin-ext/large-file-upload')],
                'large-file-upload'
            );
        }
       //配置视图的命名空间
        if ($views = $extension->views()) {
            $this->loadViewsFrom($views, 'large-file-field');
        }
        //配置laravel-admin启动时加载扩展包里的静态文件
        Admin::booting(function (){
            Admin::js('vendor/laravel-admin-ext/large-file-upload/js/aetherupload.admin.js');
            Admin::js('vendor/laravel-admin-ext/large-file-upload/js/bootstrap.file-input.js');
            Admin::js('vendor/laravel-admin-ext/large-file-upload/js/spark-md5.min.js');
        });

    }

6,修改LargeFileField.php文件

<?php
namespace Encore\LargeFileUpload;

use Encore\Admin\Form\Field;

class LargeFileField extends Field
{
/*
* 此处的large-file-field即为上一步中设置的视图的命名空间
* 直接可以调用resource目录下的views目录中的large_file_upload.blade.php文件
*/
    public $view = 'large-file-field::large_file_upload';

    public function render()
    {
        $name = $this->formatName($this->column);

        $this->script = <<<SRC

        $('#{$name}-file').bootstrapFileInput();
        $('#{$name}-file').change(function(){
             aetherupload('{$name}', this, 'file').success(getPath).upload('{$name}');
        });

SRC;
        return parent::render();
    }
}

7,本地加载扩展包,在需要安装该扩展包的项目根目录的composer.json文件中(注意不是扩展包目录),加入如下代码:

"repositories": [
    {
        "type": "path",
        "url": "app/Admin/extensions/laravel-admin-ext/large-file-upload"
    }
]

8,本地安装并发布静态资源

composer require laravel-admin-ext/large-file-upload
php artisan vendor:publish --tag=large-file-upload

9, 注册进laravel-admin,在app/Admin/bootstrap.php中添加以下代码:(当然你可以起其他的名字)

Encore\Admin\Form::extend('largefile', \Encore\LargeFileUpload\LargeFileField::class);

10, 在控制器中调用:

$form->largefile('ColumnName', 'LabelName');

效果如图:
file
11,上传github并发布Packagist,就可以随时使用,不必每次都复制黏贴代码了。

总结:本文其实是对于laravel-admin文档中自定义工具开发和扩展开发的一个小整合,由于aetherupload项目对于laravel-admin并不友好,所以针对性的对于js脚本和视图逻辑进行了优化,完成了这个小扩展包。希望大家有开发出比较实用的扩展,也能贡献出来,为开源事业做贡献。
项目地址:https://github.com/Dianwoung/large-file-up...

本作品采用《CC 协议》,转载必须注明作者和本文链接
附言 1  ·  5年前
本帖由系统于 4年前 自动加精
DianWang
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 15

有点恐怖,兄弟,你测试过了吗。
资源全部发布在js目录下,组件调用的确是vendor/laravel-admin-ext/large-file-upload/js/

file

file

5年前 评论

很明显,你的发布没有做任何的操作

5年前 评论
DianWang

@doobi sorry,文档写错了,是这个命令

 php artisan vendor:publish --tag=large-file-upload

谢谢测试!

5年前 评论

@DianWang
嗯嗯,已经测试成功,但是create的时候没问题,edit编辑操作时,保存后该字段的值又变为空了

5年前 评论

@DianWang 视图可以发布到本地吗,还是可以直接把large-file-upload/resources/views/large_file_upload.blade.php复制到views/vendor/large-file-upload/large_file_upload.blade.php

5年前 评论
DianWang

@doobi 我看了下,少了个标签,修复了下视图,你把本地删除,重新安装一下吧

5年前 评论

可不可以配置上传到云存储平台?

5年前 评论
DianWang

@xuemingzhi 各个平台不一样的,你可以用七牛云的js-sdk自己封装一个,也是分片上传的,没什么难度。

5年前 评论

AetherUpload 2 已发布,根据用户反馈和需求,添加分布式部署支持、添加Mime-Type检查、添加头文件redis储存驱动、添加跨域中间件、添加秒传开关配置项、添加自定义黑名单配置项、代码重构优化。加了新功能和很多优化,你这边可以更新下(比起laravel-admin个人更喜欢用Laravel-Backpack :grin:

5年前 评论
DianWang

@Payne 最近没时间,会在下个月更新 :joy:

5年前 评论

还没更新AetherUpload 2吗?

4年前 评论
DianWang (楼主) 4年前

file 返回的地址为什么是 _

3年前 评论

请问,这个是支持直传 oss 的吗?

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!