wearemodus / flysystem-cloudinary
Flysystem 的 Cloudinary 适配器。
v2.0.0
2021-07-22 21:05 UTC
Requires
- php: >=7.4
- ext-fileinfo: *
- cloudinary/cloudinary_php: ^2
- league/flysystem: ^1.1
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-23 04:16:22 UTC
README
这是 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 集成,您需要创建一个新的文件系统驱动程序,如下所述
- 定义您的 Cloudinary
.env
变量CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
- 在您的
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'), ], ]
- 创建一个新的 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)); }); }
- 最后,在管理媒体时,只需将
'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