laravel-admin1.7使用large-file-upload大文件上传插件的完整过程
2019-10-03 admin laravel 2463
本扩展包是基于peinhu的AetherUpload-Laravel针对laravel-admin开发的大文件上传工具, 直接用于Form组件。当前版本为Laravel 5.5, 经测试,可兼容Laravel6.03,使用经过如下:
1. 安装:
composer require dianwoung/large-file-upload
2. 发布AetherUpload-laravel的静态资源:
php artisan aetherupload:publish
3. 上传文件配置信息在config/aetherupload.php文件中修改(详细信息请参考说明文档)
4. 发布本扩展包的静态资源:
php artisan vendor:publish --tag=large-file-upload
5. 注册进laravel-admin,在app/Admin/bootstrap.php中添加以下代码:
Encore\Admin\Form::extend('largefile', \Encore\LargeFileUpload\LargeFileField::class);
6 .在控制器中直接调用就可以了:
$form->largefile('ColumnName', 'LabelName');
在实际使用中发现问题:
首先是上传路径是在config/aetherupload.php配置文件中修改,但都位于storage/app/目录下,而laravel默认能访问的是public根目录。解决办法:
1. 修改aetherupload.php中的root_dir为public,再执行命令生成相关目录,并给予权限:
php artisan aetherupload:groups
2. 创建软链接,在根目录下执行:
php artisan storage:link
此时 public 文件夹下多了一个 storage 文件夹,上传文件,返回的文件地址是这样的
file_201910_889cc0e3663efb2a46dd8564323740d7.mp4
我们需要在model中定义访问器,将地址转换成这样的:
https://blog.dzbfsj.com/storage/file/201910/889cc0e3663efb2a46dd8564323740d7.mp4
在model中加入以下代码:
public function geturlAttribute($value) { return url('storage/'.str_replace('_','/',$value));//替换_为/并用url生成完整网址 }
测试使用正常。
2019.10.21晚上查看源码,发现另一种方法修改:
搜索SavedPathResolver.php文件,直接修改源码:
namespace AetherUpload; class SavedPathResolver { public static function encode($group, $groupSubDir, $name) { return $group . '_' . $groupSubDir . '_' . $name; } public static function decode($savedPath) { list($group, $groupSubDir, $name) = explode('_', $savedPath); return (object)[ 'group' => $group, 'groupSubDir' => $groupSubDir, 'resourceName' => $name, ]; } }
其它修改:
一是头文件存储使用redis,以加快读写速度,先修改刚才的配置文件:
'header_storage_disk' => 'redis',
在config/filesystems.php中添加以下配置:
'disks' => [ ... 'redis' => [ 'driver' => 'redis', 'disable_asserts'=>true, ], ... ]
二是启用秒传,修改刚才的配置文件:
'instant_completion' => true,
但使用中发现,上传报错,原因暂时未知。
原因已找到,原来是不支持laravel6.0以上版本,换5.8正常。查看redis key,没有aetherupload_resource这个key,而laravel5.8确有。通过全新安装的方式比较发现的。