wearemodus / flysystem-cloudinary

Flysystem 的 Cloudinary 适配器。

v2.0.0 2021-07-22 21:05 UTC

This package is auto-updated.

Last update: 2024-09-23 04:16:22 UTC


README

Software License

这是 Flysystem 的 适配器,用于 Cloudinary API

安装

composer require wearemodus/flysystem-cloudinary '~2.0'

或者在您的 composer.json 文件的 require 部分添加以下字符串

{
  "require": {
    "wearemodus/flysystem-cloudinary": "~2.0"
  }
}

引导

<?php
use WeAreModus\Flysystem\Cloudinary\ApiFacade as CloudinaryClient;
use WeAreModus\Flysystem\Cloudinary\CloudinaryAdapter;
use League\Flysystem\Filesystem;

include __DIR__ . '/vendor/autoload.php';

$client = new CloudinaryClient([
    'cloud_name' => 'your-cloudname-here',
    'api_key' => 'api-key',
    'api_secret' => 'You-know-what-to-do',
    'overwrite' => true, // set this to true if you want to overwrite existing files using $filesystem->write();
]);

$adapter = new CloudinaryAdapter($client);
// This option disables assert that file is absent before calling `write`.
// It is necessary if you want to overwrite files on `write` as Cloudinary does it by default.
$filesystem = new Filesystem($adapter, ['disable_asserts' => true]);

Cloudinary 功能

请注意 Cloudinary 的三个潜在痛点

  • 它会自动将其 public_id 添加文件扩展名。在 Flysystem 的术语中,cloudinary 的 public_id 被视为文件名。但是,如果您将 public_id 设置为 'test.jpg',Cloudinary 将文件保存为 'test.jpg.jpg'。为了解决这个问题,您可以使用 PathConverterInterface
  • 它不支持通过 API 创建文件夹
  • 如果您想使用文件夹保存文件,应该设置 public_ids 如 'test/test.jpg',并在 Cloudinary 控制面板中的帐户设置中允许自动创建文件夹。

好消息!

该库支持 Cloudinary 变换

WeAreModus 分支

此分支包括一些必要的更改,以满足我的用例。有关更改的完整列表,请参阅 CHANGELOG.md,但以下是简要说明

  • 上传设置默认为 'auto' 的 resource_type,以支持视频上传(除了图片)
  • DataUri 现在仅使用前 1 MB 的媒体读取 mime-type,以防止由于 finfo->buffer() 导致的大文件内存溢出
  • ApiFacade 构造函数现在接受一个包含通过 Cloudinary SDK 的上传函数传递的选项的 uploadOptions 参数
  • 添加了显式 PHP 类型(这将防止与 PHP <7.4 兼容)
  • 更新了依赖项(PHP >=7.4,PHPUnit ^9,cloudinary_php ^2,php_codesniffer 3.)

与 Laravel-MediaLibrary 一起使用

为了将此 Cloudinary 文件系统与 Laravel-MediaLibrary 集成,您需要创建一个新的文件系统驱动程序,如下所述

  1. 定义您的 Cloudinary .env 变量
    • CLOUDINARY_CLOUD_NAME=
    • CLOUDINARY_API_KEY=
    • CLOUDINARY_API_SECRET=
  2. 在您的 filesystems.php 配置文件中定义一个新的文件系统驱动程序(在 'disks' 数组中)
    'disks' => [
         ...
    
         'cloudinary' => [
             'driver'     => 'cloudinary',
             'cloud_name' => env('CLOUDINARY_CLOUD_NAME'),
             'api_key'    => env('CLOUDINARY_API_KEY'),
             'api_secret' => env('CLOUDINARY_API_SECRET'),
         ],
    ]
  3. 创建一个新的 CloudinaryServiceProvider(使用 php artisan make:provider CloudinarySeviceProvider),并将此代码插入 boot() 方法中
    use WeAreModus\Flysystem\Cloudinary\ApiFacade as CloudinaryClient;
    use WeAreModus\Flysystem\Cloudinary\CloudinaryAdapter;
    use WeAreModus\Flysystem\Cloudinary\Converter\TruncateExtensionConverter;
    use Illuminate\Support\Facades\Storage;
    use Illuminate\Support\ServiceProvider;
    use League\Flysystem\Filesystem;
    
    ...
    
    public function boot() 
    {
        Storage::extend('cloudinary', function ($app, $config) {
        $client = new CloudinaryClient(
                [
                    'cloud_name' => $config['cloud_name'],
                    'api_key'    => $config['api_key'],
                    'api_secret' => $config['api_secret'],
                    'overwrite'  => $config['overwrite'] ?? true,
                ], // Cloudinary API options
                [
                    'resource_type'          => 'auto',
                    'eager'                  => [
                        ['fetch_format' => 'mp4', 'format' => '', 'video_codec' => 'h264', 'quality' => '70'], // f_mp4,vc_h264,q_70
                        ['fetch_format' => 'png', 'format' => '', 'quality' => '70'], // f_png,q_70
                    ],
                    'eager_async'            => 'true',
                    'eager_notification_url' => 'https://mysite.test/webhook/eager',
                    'notification_url'       => 'https://mysite.test/webhook/upload',
                    ...
                ], // Upload options
                new TruncateExtensionConverter()
           );
            
            return new Filesystem(new CloudinaryAdapter($client));
        });
    }
  4. 最后,在管理媒体时,只需将 'cloudinary' 定义为您的 diskName 即可
    $this->addMediaCollection('videos')->useDisk('cloudinary'); // Use Cloudinary as disk for the entire collection
    // OR
    $model->addMedia($mediaPath)
          ->toMediaCollection('videos', 'cloudinary'); // USe Cloudinary as disk for this media only