Я использую медиабиблиотеку laravel spatie и хочу хранить файлы в структуре каталогов, например /год/месяц/дата.
Читаю здесь https://spatie.be/docs/laravel-medialibrary/v11/advanced-usage/using-a-custom-directory-structure
и я создал этот файл в /app/Services/MediaLibrary/CustomPathGenerator.php, который я перечисляю ниже.
Теперь файлы хранятся в том месте, где я хочу.
Но моя проблема в том, что когда я пытаюсь ПРОЧИТАТЬ файл, это НЕ МОЖЕТ НАЙТИ, потому что то же правило применяется при попытке прочитать местоположение файла, а дата изменилась, а затем указывает на другой путь, который не существует.
Есть идеи, как это решить?
Спасибо!
Вот мой файл /app/Services/MediaLibrary/CustomPathGenerator.php:
<?php
namespace App\Services\MediaLibrary;
use \Spatie\MediaLibrary\MediaCollections\Models\Media;
use Spatie\MediaLibrary\Support\PathGenerator\PathGenerator as BasePathGenerator;
class CustomPathGenerator implements BasePathGenerator
{
/**
* Get the path for the given media, relative to the root storage path.
*
* @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
*
* @return string
*/
public function getPath(Media $media): string
{
//return $this->getBasePath($media).'/';
//return md5($media->id . config('app.key')) . '/';
$md5_var=md5($media->id . config('app.key'));
$myPath=date("Y").'/'.date("m").'/'.substr($md5_var,0,4). '/'.substr($md5_var,4,4) . '/'.substr($md5_var,8,4).'/'.$md5_var.'/';
return $myPath;
}
/**
* Get the path for conversions of the given media, relative to the root storage path.
*
* @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
*
* @return string
*/
public function getPathForConversions(Media $media): string
{
//return $this->getBasePath($media).'/conversions/';
//return md5($media->id . config('app.key')) . '/conversions/';
$md5_var=md5($media->id . config('app.key'));
$myPath=date("Y").'/'.date("m").'/'.substr($md5_var,0,4). '/'.substr($md5_var,4,4) . '/'.substr($md5_var,8,4).'/'.$md5_var. '/conversions/';
return $myPath;
}
/**
* Get the path for responsive images of the given media, relative to the root storage path.
*
* @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
*
* @return string
*/
public function getPathForResponsiveImages(Media $media): string
{
//return $this->getBasePath($media).'/responsive-images/';
//return md5($media->id . config('app.key')) . '/responsive-images/';
$md5_var=md5($media->id . config('app.key'));
$myPath=date("Y").'/'.date("m").'/'.substr($md5_var,0,4). '/'.substr($md5_var,4,4) . '/'.substr($md5_var,8,4).'/'.$md5_var. '/responsive-images/';
return $myPath;
}
}






Вы можете изменить класс создателя пути, чтобы использовать дату create_at, если модель мультимедиа уже сохранена.
Я написал пример подхода, возможно, для его работы в вашей среде, конечно, потребуются изменения:
<?php
namespace App\Services\MediaLibrary;
use \Spatie\MediaLibrary\MediaCollections\Models\Media;
use Spatie\MediaLibrary\Support\PathGenerator\PathGenerator as BasePathGenerator;
class CustomPathGenerator implements BasePathGenerator
{
private function getFilePath(Media $media, ?string $extra = null): string
{
$datePart = date('Y/m');
if ($media->exists) {
$datePart = $media->created_at->format('Y/m');
}
$md5_var = md5($media->id . config('app.key'));
return implode('/', array_filter([
$datePart,
substr($md5_var, 0, 4),
substr($md5_var, 4, 4),
substr($md5_var, 8, 4),
$md5_var,
$extra
])) . '/';
}
/**
* Get the path for the given media, relative to the root storage path.
*
* @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
*
* @return string
*/
public function getPath(Media $media): string
{
return $this->getFilePath($media);
}
/**
* Get the path for conversions of the given media, relative to the root storage path.
*
* @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
*
* @return string
*/
public function getPathForConversions(Media $media): string
{
return $this->getFilePath($media, 'conversions');
}
/**
* Get the path for responsive images of the given media, relative to the root storage path.
*
* @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
*
* @return string
*/
public function getPathForResponsiveImages(Media $media): string
{
return $this->getFilePath($media, 'responsive-images');
}
}
Но разве местоположение файла не хранится в виде информации?!