将 Cloudinary 与 spatie/media-library Laravel 包一起使用

Using Cloudinary with spatie/media-library Laravel package

有人在 Cloudinary 中使用 Laravel 软件包 spatie/media-library 吗?
我认为使用 flysystem 实现它是微不足道的。
我实际上将 Cloudinary 用作 silvanite/nova-field-cloudinary 的 Nova 字段,它工作得很好,但我需要不支持开箱即用的 media-libaray。

那么,我做了什么:
- 添加云盘:

'cloudinary' => [
    'driver' => 'cloudinary',
    'api_key' => env('CLOUDINARY_API_KEY'),
    'api_secret' => env('CLOUDINARY_API_SECRET'),
    'cloud_name' => env('CLOUDINARY_CLOUD_NAME'),
    'url' => env('CLOUDINARY_URL'),
],

然后我得到 "File not found" 错误。图片已上传,但记录未保存到数据库。

#message: "File not found at path: 711297/my-image.jpg"
#code: 0
#file: "./vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php"
#line: 435
-previous: League\Flysystem\FileNotFoundException^ {#2389
#path: "711297/my-image.jpg"
#message: "File not found at path: 711297/my-image.jpg"
#code: 0
#file: "./vendor/league/flysystem/src/Filesystem.php"
#line: 389
trace: {
./vendor/league/flysystem/src/Filesystem.php:389 { …}
./vendor/league/flysystem/src/Filesystem.php:194 { …}
./vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php:433 { …}
./vendor/spatie/laravel-medialibrary/src/Filesystem/Filesystem.php:81 { …}
./vendor/spatie/laravel-medialibrary/src/Filesystem/Filesystem.php:88 { …}
./vendor/spatie/laravel-medialibrary/src/FileManipulator.php:77 { …}
./vendor/spatie/laravel-medialibrary/src/FileManipulator.php:44 { …}
./vendor/spatie/laravel-medialibrary/src/Filesystem/Filesystem.php:33 { …}
./vendor/spatie/laravel-medialibrary/src/FileAdder/FileAdder.php:310 { …}
./vendor/spatie/laravel-medialibrary/src/FileAdder/FileAdder.php:301 { …}
./vendor/spatie/laravel-medialibrary/src/FileAdder/FileAdder.php:251 { …}
./vendor/efdi/carmarket-module/src/Jobs/ImportImages.php:145 { …}
./vendor/efdi/carmarket-module/src/Jobs/ImportImages.php:84 { …}
./vendor/efdi/carmarket-module/src/Jobs/ImportImages.php:43 { …}

所以问题似乎是它试图使用当然不存在的本地路径加载图像。
我尝试使用自定义 PathGenerator,因此 returns url 没有解决方案,因为它需要路径。
我不知道他们是如何为 S3 做的。

因此,如果有人知道如何解决这个问题或有可行的解决方案,我将不胜感激。

发生这种情况是因为 spatie 包正在尝试对上传的图像进行转换。转到 medialibrary.php 配置文件并注释掉这些行:

    'image_generators' => [
        Spatie\MediaLibrary\ImageGenerators\FileTypes\Image::class,
        Spatie\MediaLibrary\ImageGenerators\FileTypes\Webp::class,
        Spatie\MediaLibrary\ImageGenerators\FileTypes\Pdf::class,
        Spatie\MediaLibrary\ImageGenerators\FileTypes\Svg::class,
        Spatie\MediaLibrary\ImageGenerators\FileTypes\Video::class,
    ],

如果找不到给定图像 mime 类型的生成器,则不会转换图像。因此不会抛出错误。然后使用 cloudinary 转换您的图像。

为此,我创建了一个扩展 BaseUrlGeneratorCloudinaryUrlGenerator

    const HOST = 'https://res.cloudinary.com/';

    /**
     * Get the url for a media item.
     *
     * @return string
     */
    public function getUrl(): string
    {
        $cloudBaseUrl = self::HOST . config('filesystems.disks.cloudinary.cloud_name') . '/';

        $options = [
            'q_auto',
        ];

        $filePathIncludingFilenameAndExtension = '/' . $this->pathGenerator->getPath($this->media) . $this->media->file_name;

        return $cloudBaseUrl . implode(',', $options) . $filePathIncludingFilenameAndExtension;
    }

getTemporaryUrlgetResponsiveImagesDirectoryUrl 中,我只是返回了:$this->getUrl()

完成此操作后,您就可以像这样获取图像:

<img src="{{ $model->media->first()->getUrl() }}" />