Skip to content

提示

兰空图床中的储存策略是整个系统的核心部分之一,目前支持本地AWS S3阿里云 OSS腾讯云 COS七牛云又拍云SFTPFTPWebDavMinio。 一个储存策略可以归属于多个角色组,同时某个角色组也可以设置多个储存策略。

如何设置归属角色组?

在创建、编辑储存策略时,第一栏的角色组输入框会展示全部已存在的角色组,鼠标单击可直接选择,mac 按住 command 加鼠标左键可以多选、取消选择,windows 上为 ctrlalt 键。

如何自定义一个储存?

WARNING

  • 首先你需要有一定的 PHP 的编程基础,并对 Laravel 有一定的了解。
  • 兰空图床的储存是由 flysystem 实现,flysystem 提供了一个接口来与不同类型的文件系统进行交互(增删改查等),你只需要按照 flysystem 提供的接口实现你的储存即可。此教程不会详细的指导你如何实现该接口。这里有一份兰空图床实现的又拍云适配器 https://github.com/0xxb/flysystem-upyun 供你参考。

储存驱动适配好以后,接下来要做的就是集成到兰空图床当中。

  1. 你需要使用 composer 安装你的驱动器。现在我们假设你的驱动器名称为 flysystem-custom

composer install xxx/flysystem-custom

  1. 增加一个枚举类

app/Enums/Strategy 文件夹中新增一个文件 CustomOption,内容如下

php
<?php

namespace App\Enums\Strategy;

final class CustomOption
{
    /** @var string 访问地址 */
    const Url = 'url';

    /** @var string 用户名 */
    const Username = 'username';

    /** @var string 密码 */
    const Password = 'password';

    /** @var string 储存名称 */
    const Bucket = 'bucket';
}

该枚举由你的储存需要的配置而定,其中 url 不管是什么储存都是必须的

  1. 增加一个枚举常量

打开 app/Enums/StrategyKey.php 文件追加一行

php
// ...
/** @var int Custom */
const Custom = 11;
// ...

此常量值可以自定义,但不要和其他常量值重复。

  1. 更改图片服务类中的 getAdapter 方法

打开 app/Services/ImageService.php 文件定位到 getAdapter 方法,你可以看到所有储存策略都是通过这个方法进行实例化的。 我们来增加一个 adapter,在 match 表达式中追加内容:

php

// ...

use App\Enums\Strategy\CustomOption;

// ....

StrategyKey::Custom => new CustomAdapter(
    username: $configs->get(CustomOption::Username),
    password: $configs->get(CustomOption::Password),
    bucket: $configs->get(CustomOption::Bucket),
),

// ...
  1. 给模型中的驱动常量加上自定义储存

打开 app/Models/Strategy.php 文件,在 DRIVERS 常量中追加一行

php
// ...
const DRIVERS = [
    // ...
    StrategyKey::Custom => '自定义储存',
];
// ...
  1. 修改表单验证器

打开 app/Http/Requests/Admin/StrategyRequest.php 文件, 在 rules 方法里追加验证内容

php

// ...

return array_merge($array, match((int)$this->input('key')) {
    // ...
    StrategyKey::Custom => [
        'configs.username' => 'required',
        'configs.password' => 'required',
        'configs.bucket' => 'required',
    ],
});

// ...

验证规则请参考 Laravel 官方文档

  1. 增加 web 设置表单页面

打开 resources/views/admin/strategy/add.blade.phpresources/views/admin/strategy/edit.blade.php
参考其他的储存策略表单,例如 minio:
添加页面:add.blade.php
编辑页面:edit.blade.php

至此,一个新的储存就适配完成了,这时候就可以在储存策略添加表单中,选择你的自定义储存策略进行配置、测试上传、管理等。

FAQ

储存的特殊说明

本地储存

为了实现本地储存可以更改储存位置,所以本地储存必须有一个域名后缀,例如 http://domain.com/**uploads**/123.png 中的 uploads。后缀对应的是 public 目录下的符号连接。

阿里云 OSS

如果使用 RAM 账户,请授予该账户以下权限:

  • AliyunOSSFullAccess
  • AliyunOSSReadOnlyAccess

腾讯云 COS

  • 如果使用子账户,请授予该账户以下权限

    • QcloudCOSDataFullControl
    • QcloudCOSDataReadOnly
    • QcloudCOSDataWriteOnly
    • QcloudCOSFullAccess
    • QcloudCOSListOnly
    • QcloudCOSMetaAccMgmt
    • QcloudCOSReadOnlyAccess
    • QcloudAccessForCSGRole
    • QcloudAccessForDsgcRole
    • QcloudAccessForTCRRole
    • QcloudAccessForTCSRole
  • 腾讯云的储存桶名称由 名称+appid 组合,在兰空图床后台的储存策略表单中请分开填写。

Minio

  • 如果使用内网 ip 进行连接,region 可以为空,如果是外网,sdk 则会验证区域,没有设置区域则可以固定为 us-east-1