下面由Laravel教學專欄跟大家介紹關於 laravel-admin 檔案上傳OSS,希望對需要的朋友有幫助!
laravel-admin 檔案上傳OSS
前言
因為專案需求,需要把圖片上傳至阿里雲OSS,我的Api 介面和後台專案是分開的,都使用的laravel 框架開發,Api 接入OSS 這裡就不做討論了,這裡主要說一下laravel-admin 上傳阿里OSS 的問題。
網路上的一些教學也有非常好的,但只說了使用流程,很少有說碰到的問題之類的情況,這裡主要就是講述我在laravel-admin 接入阿里OSS 時所遇到的一些問題,以後還有問題時,也會在這裡更新。
開發環境
下面是我的composer.json 內容(只列出本文需要):
"require": { "php": ">=7.0.0", "encore/laravel-admin": "^1.6", "jacobcyl/ali-oss-storage": "^2.1", "laravel/framework": "5.5.*", ... }
具體流程
1、下載合適的第三方套件
在composer.json 檔案中的require 新增"jacobcyl/ali-oss-storage": "^2.1";
或直接運行composer require jacobcyl/ali-oss-storage:^2.1 亦可。
2、新增服務提供者
在config/app.php 檔案下增加Jacobcyl\AliOSS\AliOssServiceProvider::class,,如下圖所示:
#3、在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, ], ],
4、在config/filesystems.php 更改'default' 設定資訊
如下:
'default' => env('FILESYSTEM_DRIVER', 'oss'),
也可以在env 檔案中定義FILESYSTEM_DRIVER = oss 也可。
5、在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 ,這張圖片就是你想要上傳的頭像圖片位址。 這裡只是舉個例子,當然這樣寫還是不方便,萬一以後更改,還是需要找到這兩個檔案手動改,很麻煩,可根據自身需求進行解耦優化,這裡就不做討論了。重新梳理問題
之前遇到這個問題後一直沒細研究,直到最近兩天突然發現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分钟的时间,可能就是之前没有冷静梳理:我要做的是什么?得到的结果是什么?过程中会遗漏什么?
原文地址:https://segmentfault.com/a/1190000018384162?utm_source=sf-related
以上是關於 laravel-admin 檔案上傳OSS的詳細內容。更多資訊請關注PHP中文網其他相關文章!