有人在Cloudinary中使用Laravel软件包spatie / media-library吗?
我以为用flysystem实现它是微不足道的。
实际上,我正在将Cloudinary用作带有silvanite / nova-field-cloudinary的Nova字段,并且效果很好,但是我需要一个媒体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'),
],
将磁盘名称更改为cloudinary
'disk_name' => 'cloudinary',
尝试添加图片
$newMedia = $myModel
->addMediaFromUrl($imageUrl)
->setFileName($filename)
->toMediaCollection();
,然后出现“找不到文件”错误。图像已上传,但记录未保存到数据库。
#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,因此它返回的URL不能解决,因为它需要路径。
我不知道他们如何在S3上做到这一点。
因此,如果有人知道如何解决此问题或有可行的解决方案,我将不胜感激。
答案 0 :(得分:1)
发生这种情况是因为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,
],
当找不到给定图像哑剧类型的生成器时,将不会转换图像。这样就不会抛出错误。然后使用cloudinary转换图像。
为此,我创建了一个扩展CloudinaryUrlGenerator
的{{1}}。
BaseUrlGenerator
在 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;
}
和getTemporaryUrl
中,我只是返回了:getResponsiveImagesDirectoryUrl
。
完成此操作后,您可以像这样获得图像:
$this->getUrl()