sausin/laravel-ovh

laravel 对 OVH 对象存储的驱动程序

v7.2.0 2024-03-09 08:00 UTC

README

Latest Version on Packagist Continuous Integration Quality Score Total Downloads License: MIT

Laravel Storage 门面提供了对许多不同文件系统的支持。

这是一个包装器,为 Laravel 提供对 OVH 对象存储 的支持。

安装

通过 composer 安装

composer require sausin/laravel-ovh

请参阅以下关于各个分支的详细信息。您可以选择适合您开发的包版本。同时请注意升级问题。

如果您使用的是低于 5.5 的 Laravel 版本,请在 config/app.php 中的 providers 数组中添加服务提供者

Sausin\LaravelOvh\OVHServiceProvider::class

config/filesystems.php 中定义如下 ovh 驱动器

'ovh' => [
    'driver' => 'ovh',
    'authUrl' => env('OS_AUTH_URL', 'https://auth.cloud.ovh.net/v3/'),
    'projectId' => env('OS_PROJECT_ID'),
    'region' => env('OS_REGION_NAME'),
    'userDomain' => env('OS_USER_DOMAIN_NAME', 'Default'),
    'username' => env('OS_USERNAME'),
    'password' => env('OS_PASSWORD'),
    'containerName' => env('OS_CONTAINER_NAME'),

    // Since v1.2
    // Optional variable and only if you are using temporary signed urls.
    // You can also set a new key using the command 'php artisan ovh:set-temp-url-key'.
    'tempUrlKey' => env('OS_TEMP_URL_KEY'),

    // Since v2.1
    // Optional variable and only if you have setup a custom endpoint.
    'endpoint' => env('OS_CUSTOM_ENDPOINT'),

    // Optional variables for handling large objects.
    // Defaults below are 300MB threshold & 100MB segments.
    'swiftLargeObjectThreshold' => env('OS_LARGE_OBJECT_THRESHOLD', 300 * 1024 * 1024),
    'swiftSegmentSize' => env('OS_SEGMENT_SIZE', 100 * 1024 * 1024),
    'swiftSegmentContainer' => env('OS_SEGMENT_CONTAINER', null),

    // Optional variable and only if you would like to DELETE all uploaded object by DEFAULT.
    // This allows you to set an 'expiration' time for every new uploaded object to
    // your container. This will not affect objects already in your container.
    //
    // If you're not willing to DELETE uploaded objects by DEFAULT, leave it empty.
    // Really, if you don't know what you're doing, you should leave this empty as well.
    'deleteAfter' => env('OS_DEFAULT_DELETE_AFTER', null),
    
    // Optional variable to cache your storage objects in memory
    // You must require league/flysystem-cached-adapter to enable caching
    // This option is not available on laravel-ovh >= 7.0
    'cache' => true, // Defaults to false
    
    // Optional variable to set a prefix on all paths
    'prefix' => null,
],

在您的 .env 文件中定义正确的环境变量(以对应上述值),现在您应该拥有一个正常工作的 OVH 对象存储配置 😄。

环境变量 OS_AUTH_URL 对于 OVH 用户通常不会有所不同,因此不需要指定。要获取剩余变量(如 OS_USERNAMEOS_REGION_NAMEOS_CONTAINER_NAME 等)的值,您可以下载 OVH 的 Horizon 或控制面板上的详细信息配置文件

  • OVH 控制面板: 公共云 -> 项目管理 -> 用户 & 角色 -> 下载 Openstack 的 RC 文件
  • OVH Horizon: 项目 -> API 访问 -> 下载 OpenStack RC 文件 -> 身份 API v3

完成此库的配置后,请确保清除您应用程序的配置缓存

php artisan config:cache

注意:从 OVH 控制面板 下载您的 RC 配置文件将提供 Identity v2 变量名称。然而,对于此包,以下变量是等效的

您可以将 Identity v2 变量的值安全地放置在相应的变量中。

升级说明

从 3.x 到 4.x

4.x 分支开始,.env 文件中要定义的变量已被重命名,以反映 OpenStack 在其配置文件中使用的名称。这是为了消除对哪个变量应该放在哪里有任何误解。这也意味着,除非更新 .env 文件中的变量名称,否则该包可能无法正常工作。

从 4.x 到 5.x

5.x 分支开始,config/filesystems.php 文件中要定义的变量已被重命名,以更好地与 OpenStack 在其配置文件中使用的名称相对应。这是为了给开发者提供更好的理解每个配置键的内容。如果您来自 3.x,则更新 .env 中的变量名称可能是必要的,以防止失败。

从 5.x/6.x 到 7.x

7.x 分支开始,仅支持 Laravel 9 和 PHP 8。如果您之前使用了它,请从您的配置中删除 cache 选项,因为 Flysystem 不再支持 "cached adapters"。

用法

有关用法说明,请参阅详细的 Laravel Storage 文档

注意: 此包包括以下附加方法的支持

Storage::url()
Storage::temporaryUrl()

《temporaryUrl()》方法适用于私有容器,在正常情况下文件无法公开访问。这会生成一个临时签名URL。有关详细信息,请参阅OVH的临时URL文档

请记住,此功能需要容器存储一个适当的密钥。头部中的密钥应与在《config/filesystems.php》中指定的《tempUrlKey》相匹配。有关如何在您的OVH容器上设置头部的详细信息,请参阅生成临时地址(tempurl

或者,自4.x版本以来,您可以使用以下命令

# Automatically generate a key
php artisan ovh:set-temp-url-key

# Generate a key for a specific disk
php artisan ovh:set-temp-url-key --disk="other-ovh-disk"

# Set a specific key
php artisan ovh:set-temp-url-key --key=your-private-key

该软件包将在您的容器上设置相关的密钥并向您展示。如果之前已经设置了密钥,该软件包将在覆盖现有密钥之前提醒您。如果您无论如何都要强制设置新密钥,您可以在命令中使用--force标志。

一旦在您的容器中配置了密钥,您必须将其添加到您的.env文件中

OS_TEMP_URL_KEY='your-private-key'

配置自定义域名(自定义端点)

OVH的对象存储允许您将自定义域名或端点指向单个容器。为此,您必须使用DNS提供商设置一些记录,这将授权从您的端点转发到OVH服务器的请求。

要使用自定义域名,您必须在您的.env文件中指定它

OS_CUSTOM_ENDPOINT="http://my-endpoint.example.com"

有关更多信息,请参阅OVH的自定义域名文档

自动上传过期对象

此库允许您为上传的对象添加过期时间。有两种方法可以实现

  1. 通过程序指定过期时间

    • 您可以为上传对象应在删除后的秒数指定
      // Automatically expire after 1 hour of being uploaded.
      Storage::disk('ovh')->put('path/to/file.jpg', $contents, ['deleteAfter' => 60*60]);
    • 或者,您还可以指定一个时间戳,在此之后上传的对象应被删除
      // Automatically delete at the beginning of next month.
      Storage::disk('ovh')->put('path/to/file.jpg', $contents, ['deleteAt' => now()->addMonth()->startOfMonth()])
  2. 通过.env文件指定默认过期时间。这将为默认情况下上传的每个新对象设置一个过期时间(以秒为单位)

    # Delete every object after 3 days of being uploaded
    OS_DELETE_AFTER=259200

有关这些变量的更多信息,请参阅OVH的自动对象删除文档

大对象支持

此库可以帮助您通过检测文件大小阈值并自动将文件分割成较轻的段来优化大对象(如视频或磁盘镜像)的上传速度。这将通过将多个段同时写入多个对象存储节点来提高上传速度。

默认情况下,检测大对象的阈值设置为300MB,分割文件的段大小设置为100MB。如果您想更改这些值,您必须在您的.env文件中指定以下变量(以字节为单位)

# Set size threshold to 1GB
OS_LARGE_OBJECT_THRESHOLD=1073741824
# Set segment size to 200MB
OS_SEGMENT_SIZE=209715200

如果您想为存储大对象段使用单独的容器,您可以在.env文件中指定以下变量

OS_SEGMENT_CONTAINER="large-object-container-name"

在某些情况下,使用单独的容器存储大对象段可能有益,有关此方面的更多信息,请参阅OpenStack关于使用Swift为大对象的使用最后说明

有关大对象分段上传的更多信息,请参阅

表单提交中间件

虽然OVH团队没有对这个功能进行文档说明,但它在OpenStack的文档中有解释。

此功能允许您直接将文件上传到OVH服务器,而不是通过应用服务器(从而提高上传周期中的效率)。

您必须生成有效的FormPost签名,您可以使用以下函数

Storage::disk('ovh')->getAdapter()->getFormPostSignature($path, $expiresAt, $redirect, $maxFileCount, $maxFileSize);

其中

  • $path 是您希望存储文件的目录路径。
  • $expiresAt 是一个指定FormPost签名将过期的日期的 DateTimeInterface 对象。
  • $redirect 是所有文件上传完成后用户将被重定向到的URL。默认为 null 以防止重定向。
  • $maxFileCount 是用户可以使用签名上传的文件的最大数量。默认为 1 个文件。
  • $maxFileSize 是每个上传文件的大小限制。默认为 25 MB25*1024*1024)。

获取签名后,您需要将签名数据传递到您的HTML表单

<form action="{{ $url }}" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="redirect" value="{{ $redirect }}">
    <input type="hidden" name="max_file_count" value="{{ $maxFileCount }}">
    <input type="hidden" name="max_file_size" value="{{ $maxFileSize }}">

    <input type="hidden" name="expires" value="{{ $expiresAt->getTimestamp() }}">
    <input type="hidden" name="signature" value="{{ $signature }}">

    <input type="file">
</form>

注意:表单中的上传方法必须是 POST 类型。

注意:由于这是一个跨源请求,容器上需要适当的头信息。请参阅命令 php artisan ovh:set-cors-headers 的用法。

$url 变量指的是您的容器的路径URL,您可以通过传递适配器的路径来获取它 getUrl

$url = Storage::disk('ovh')->getAdapter()->getUrl($path);

注意:如果您已为对象存储容器设置自定义域名,则可以使用该域名(以及相应的路径)上传文件,而无需公开OVH的URL方案。

示例

// Generate a signature that allows an upload to the 'images' directory for the next 10 minutes.
Storage::disk('ovh')->getAdapter()->getFormPostSignature('images', now()->addMinutes(10));

// Generate a signature that redirects to a url after successful file upload to the root of the container.
Storage::disk('ovh')->getAdapter()->getFormPostSignature('', now()->addMinutes(5), route('file-uploaded'));

// Generate a signature that allows upload of 3 files until next day.
Storage::disk('ovh')->getAdapter()->getFormPostSignature('', now()->addDay(), null, 3);

// Generate a signature that allows to upload 1 file of 1GB until the next hour.
Storage::disk('ovh')->getAdapter()->getFormPostSignature('', now()->addHour(), null, 1, 1 * 1024 * 1024 * 1024);

在容器上设置访问控制头

为了使上述设置正确工作,容器上必须设置正确的头信息。此包提供了一个方便的方法,使用以下命令设置它们

php artisan ovh:set-cors-headers

默认情况下,这将允许所有来源能够上传到容器。但是,如果您只想允许特定的来源,则可以使用 --origins 标志。

如果这些头信息之前已设置,则命令将在覆盖现有头信息之前寻求确认。

前缀和多云

如上所述,prefix 参数是在版本5.3.0中引入的。这意味着使用包指定的任何路径都将使用给定的字符串作为前缀。默认情况下不添加任何内容(或者如果未设置该参数)。

例如,当在配置中将 prefix 设置为 foo 时,以下命令

Storage::disk('ovh')->url('/');

将生成一个URL,就像它使用路径 /foo 请求一样(即使用了指定的前缀)。

这在多云环境中特别强大。同一个容器可以用于所有租户,而每个租户都有自己的文件夹,几乎是自动的。可以在设置租户的中间件中更新,并使用以下命令

Config::set('filesystems.disks.ovh.prefix', 'someprefixvalue')

为每个租户设置一个单独的定制前缀!

上述两个示例都假设在配置中将磁盘命名为 ovh。请根据您的具体情况替换正确的名称。

致谢