laravel-admin 文件上傳OSS

前言

由於項目需求,須要把圖片上傳至阿里雲 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/partialsheader.blade.phpsidebar.blade.php 兩個視圖文件中顯示,請看下圖:

header.blade.php

圖片描述

sidebar.blade.php

圖片描述

而咱們在 具體流程 的 5個步驟中已經把上傳的配置改爲了 oss 了,這時訪問後臺時,就會拋出一個異常:

圖片描述

一開始我覺得是 config/filesystems.phpdefault 還寫成 local 會解決,但結果並無。因爲時間的緣由,我尚未深刻去研究,對於 laravel 框架文件上傳的原理,我仍是個新手,不過這裏放上個人解決方法,若是有更好的解決方案,歡迎下方指正,謝謝!

解決

header.blade.phpsidebar.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]

從新梳理問題(2019-04-22)

以前遇到這個問題後一直沒細研究,直到最近兩天忽然發現 laravel-admin 中的原有的管理員列表打開報錯,報錯信息以下(主要是這句報錯信息):

圖片描述

忽然看到這個錯,我內心一慌,爲何會報文件異常類沒有找到,我首先想到的是否是我以前上傳文件的配置有問題,可是回想一下個人程序後排除這個可能性。由於在上述配置完畢後,我已經成功把圖片上傳至阿里 OSS 上了,這就說明配置是成功的,那爲何還會報錯呢,我就在想是否是有些細節是我沒注意到的,通過測試,果真如此:

  1. laravel-admin 在安裝完成後就已經有了系統設置這些板塊,包括權限管理;
  2. 數據庫的遷移文件中也有了部分數據,其中 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.phpsidebar.blade.php 兩個視圖文件中的圖片地址改了,只是解決一時問題,其實這兩個文件並無什麼問題,我把兩個視圖文件還原(上面有圖片),其中 {{ Admin::user()->avatar }} 就是從 admin_users 表中獲取頭像的 URL,只要表中這個 URL 是真實正確的(也就是 OSS 上的圖片路徑),那就能夠成功加載!

總結

其實這個問題是一個很是簡單的問題,上傳文件的磁盤都已經改了,原先的路徑天然就失效了,確定加載失敗!從管理員列表打開報錯,到解決,只花費了不到5分鐘的時間,可能就是以前沒有冷靜梳理:我要作的是什麼?獲得的結果是什麼?過程當中會遺漏什麼?

道阻且長,仍需不斷前行!

相關文章
相關標籤/搜索