由于项目需求,须要把图片上传至阿里云 OSS,个人 Api 接口和后台项目是分开的,都使用的 laravel 框架开发,Api 接入 OSS 这里就不作讨论了,这里主要说一下 laravel-admin 上传阿里 OSS 的问题。php
网上的一些教程也有很是好的,但只说了使用流程,不多有说碰到的问题之类的状况,这里主要就是讲述我在 laravel-admin 接入阿里 OSS 时所遇到的一些问题,之后还有问题时,也会在这里更新。laravel
下面是个人 composer.json
内容(只列出本文须要):数据库
"require": { "php": ">=7.0.0", "encore/laravel-admin": "^1.6", "jacobcyl/ali-oss-storage": "^2.1", "laravel/framework": "5.5.*", ... }
在 composer.json
文件中的 require 添加 "jacobcyl/ali-oss-storage": "^2.1"
;json
或者直接运行 composer require jacobcyl/ali-oss-storage:^2.1
亦可。app
在 config/app.php
文件下增长 Jacobcyl\AliOSS\AliOssServiceProvider::class,
,以下图所示:composer
config/filesystems.php
增长 OSS 配置信息以下:框架
'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), ], // 这里是新增 'oss' => [ 'driver' => 'oss', 'access_id' => // 这里是你的 OSS 的 accessId, 'access_key' => // 这里是你的 OSS 的 accessKey, 'bucket' => // 这里是你的 OSS 自定义的存储空间名称, 'endpoint' => 'oss-cn-hangzhou.aliyuncs.com', // 这里以杭州为例 'cdnDomain' => '', // 使用 cdn 时才须要写, https://加上 Bucket 域名 'ssl' => true, // true 使用 'https://' false 使用 'http://'. 默认 false, 'isCName' => false, // 是否使用自定义域名,true: Storage.url() 会使用自定义的 cdn 或域名生成文件 url,false: 使用外部节点生成url 'debug' => false, ], ],
config/filesystems.php
更改 'default'
配置信息以下:ide
'default' => env('FILESYSTEM_DRIVER', 'oss'),
也能够在 env
文件中定义 FILESYSTEM_DRIVER = oss
也可。测试
config/admin.php
修改 upload
配置以下:优化
'upload' => [ // Disk in `config/filesystem.php`. 'disk' => 'oss', // 这里就是指向 disks 下面的 oss 配置 // Image and file upload path under the disk above. 'directory' => [ 'image' => 'images', 'file' => 'files', ], ],
网上的步骤通常就是到这里了,上面的流程参考:laravel-admin 文件上传 oss;
可是这时候问题就出现了, laravel-admin
自己为了开发者快速开发,自己就完成了一部分功能,当咱们使用默认帐号 admin
登陆进去后,在后台的页面右上角和左上角都有默认的头像显示,这个默认头像是存放在本地 local
下的,在 vendor/encore/laravel-admin/resources/views/partials
下 header.blade.php
和 sidebar.blade.php
两个视图文件中显示,请看下图:
header.blade.php
sidebar.blade.php
而咱们在 具体流程
的 5个步骤中已经把上传的配置改为了 oss 了,这时访问后台时,就会抛出一个异常:
一开始我觉得是 config/filesystems.php
的 default
还写成 local
会解决,但结果并无。因为时间的缘由,我尚未深刻去研究,对于 laravel 框架文件上传的原理,我仍是个新手,不过这里放上个人解决方法,若是有更好的解决方案,欢迎下方指正,谢谢!
把 header.blade.php
和 sidebar.blade.php
两个视图文件中的图片的 src
改为阿里云 OSS 存放图片的路径,好比: https://xxx.oss-cn-hangzhou.aliyuncs.com/xxx/xxx/5c77a20012963.jpg
,这张图片就是你想要上传的头像图片地址。
这里只是举个例子,固然这样写仍是不方便,万一之后更改,仍是须要找到这两个文件手动改,很麻烦,可根据自身需求进行解耦优化,这里就不作讨论了。
道阻且长,仍需不断前行!
文章参考: [https://blog.csdn.net/zxdf123/article/details/82752145][6] [https://blog.csdn.net/guyaofei/article/details/79918697][7]
以前遇到这个问题后一直没细研究,直到最近两天忽然发现 laravel-admin
中的原有的管理员列表打开报错,报错信息以下(主要是这句报错信息):
忽然看到这个错,我内心一慌,为何会报文件异常类没有找到,我首先想到的是否是我以前上传文件的配置有问题,可是回想一下个人程序后排除这个可能性。由于在上述配置完毕后,我已经成功把图片上传至阿里 OSS 上了,这就说明配置是成功的,那为何还会报错呢,我就在想是否是有些细节是我没注意到的,通过测试,果真如此:
laravel-admin
在安装完成后就已经有了系统设置这些板块,包括权限管理;数据库的迁移文件中也有了部分数据,其中 admin_users
数据表中就有一条数据;表结构以下:
CREATE TABLE `admin_users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, `password` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `admin_users_username_unique` (`username`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
其中头像 avatar
字段的值,也就是 URL 地址是本地的路径,由于 laravel-admin
默认文件上传的磁盘是 local
,但此时我已经把上传路径改成 OSS 了,这就致使文件系统加载不到原有的这张图,从而报的文件系统异常。
以前我把上述的 header.blade.php
和 sidebar.blade.php
两个视图文件中的图片地址改了,只是解决一时问题,其实这两个文件并无什么问题,我把两个视图文件还原(上面有图片),其中 {{ Admin::user()->avatar }}
就是从 admin_users
表中获取头像的 URL,只要表中这个 URL 是真实正确的(也就是 OSS 上的图片路径),那就能够成功加载!
其实这个问题是一个很是简单的问题,上传文件的磁盘都已经改了,原先的路径天然就失效了,确定加载失败!从管理员列表打开报错,到解决,只花费了不到5分钟的时间,可能就是以前没有冷静梳理:我要作的是什么?获得的结果是什么?过程当中会遗漏什么?
道阻且长,仍需不断前行!