首頁  >  文章  >  php框架  >  關於 laravel-admin 檔案上傳OSS

關於 laravel-admin 檔案上傳OSS

藏色散人
藏色散人轉載
2020-09-11 14:01:573964瀏覽

下面由Laravel教學專欄跟大家介紹關於 laravel-admin 檔案上傳OSS,希望對需要的朋友有幫助!

關於 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,,如下圖所示:

關於 laravel-admin 檔案上傳OSS

#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

關於 laravel-admin 檔案上傳OSS

##sidebar .blade.php

關於 laravel-admin 檔案上傳OSS

而我們在具體流程的5個步驟中已經把上傳的配置改成了oss 了,這時訪問後台時,就會拋出一個例外:

關於 laravel-admin 檔案上傳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 中的原有的管理員清單打開報錯,報錯訊息如下(主要是這句報錯訊息):

關於 laravel-admin 檔案上傳OSS

突然看到這個錯,我心裡一慌,為什麼會報文件異常類別沒有找到,我首先想到的是不是我之前上傳檔案的配置有問題,但是回想一下我的程式後排除這個可能性。因為上述配置完畢後,我已經成功把圖片上傳至阿里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中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除