Home > Article > PHP Framework > About laravel-admin file upload to OSS
The following tutorial column of Laravel will introduce to you about laravel-admin file upload to OSS. I hope it will be helpful to friends in need!
laravel-admin file upload OSS
Foreword
Due to project requirements, I need to upload images to Alibaba Cloud OSS. My Api interface and backend project are separate and are developed using the laravel framework. The Api access to OSS will not be discussed here. Here I will mainly talk about the problem of laravel-admin uploading Alibaba OSS. .
There are some very good tutorials on the Internet, but they only talk about the usage process, and rarely talk about the problems encountered. Here I mainly talk about what I did when I connected laravel-admin to Alibaba OSS. Some problems encountered will be updated here if there are still problems in the future.
Development environment
The following is the content of my composer.json (only required for this article):
"require": { "php": ">=7.0.0", "encore/laravel-admin": "^1.6", "jacobcyl/ali-oss-storage": "^2.1", "laravel/framework": "5.5.*", ... }
Specific process
1. Download the appropriate third-party package
Add "jacobcyl/ali-oss-storage": "^2.1";
## to the require in the composer.json file #Or run composer require jacobcyl/ali-oss-storage:^2.1 directly. 2. Add a service providerAdd Jacobcyl\AliOSS\AliOssServiceProvider::class, under the config/app.php file, as shown in the figure below: 3. Add the OSS configuration information in config/filesystems.php as follows:'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. Change the 'default' configuration information in config/filesystems.php As follows:
'default' => env('FILESYSTEM_DRIVER', 'oss'),You can also define FILESYSTEM_DRIVER = oss in the env file. 5. Modify the upload configuration in config/admin.php as follows:
'upload' => [ // Disk in `config/filesystem.php`. 'disk' => 'oss', // 这里就是指向 disks 下面的 oss 配置 // Image and file upload path under the disk above. 'directory' => [ 'image' => 'images', 'file' => 'files', ], ],The online steps generally end here. For the above process, refer to: laravel-admin file Upload oss;
Problems occur
But problems arise at this time. laravel-admin itself has completed part of the functions for developers to develop quickly. When we After logging in using the default account admin, there are default avatars displayed in the upper right corner and upper left corner of the background page. This default avatar is stored locally, under vendor/encore/laravel-admin/resources/views/partials Displayed in two view files, header.blade.php and sidebar.blade.php, please see the picture below: header.blade.php sidebar .blade.php #And we have changed the uploaded configuration to oss in the 5 steps of the specific process. At this time, when accessing the background, it will throw An exception: #At first I thought it would be solved if the default in config/filesystems.php was written as local, but it didn’t. Due to time constraints, I haven't done in-depth research yet. I'm still a novice on the principle of laravel framework file upload, but here is my solution. If there is a better solution, please feel free to correct me below, thank you!Solution
Change the src of the images in the header.blade.php and sidebar.blade.php view files to the path where Alibaba Cloud OSS stores the images. For example: https://xxx.oss-cn-hangzhou.aliyuncs.com/xxx/xxx/5c77a20012963.jpg, this picture is the address of the avatar picture you want to upload. This is just an example. Of course, it is inconvenient to write like this. If you change it in the future, you still need to find these two files and change them manually. It is very troublesome. You can decouple and optimize according to your own needs, which will not be done here. Discussed.Reorganize the problem
I never studied this problem in detail until I suddenly discovered the original problem in laravel-admin in the past two days. Some administrators opened the list and reported an error. The error message was as follows (mainly this error message): Suddenly seeing this error, I panicked. Why was the file reported? The exception class was not found. My first thought was whether there was something wrong with the configuration of the file I uploaded before, but after thinking about my program, I eliminated this possibility. Because after completing the above configuration, I have successfully uploaded the image to Alibaba OSS, which means that the configuration is successful, so why is an error still reported? I was wondering if there are some details that I did not notice. Test, it is indeed the case: laravel-admin already has these sections of system settings after the installation is completed, including permission management;数据库的迁移文件中也有了部分数据,其中 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
The above is the detailed content of About laravel-admin file upload to OSS. For more information, please follow other related articles on the PHP Chinese website!