Laravel Spatie MediaLibrary自定义/年/月/日路径读取失败求助
解决Spatie MediaLibrary自定义路径读取失效问题
你的问题核心是:路径生成时使用了当前日期(date()函数),而非媒体文件存储时的日期。存储时文件被放在当天的年月目录,但读取时会生成当前年月的路径,自然找不到旧文件。
修复方案
改用Media模型自带的created_at字段(即文件存储时的时间)来生成年月路径,替换掉date()函数即可。修改后的完整代码如下:
<?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 { $md5_var = md5($media->id . config('app.key')); // 使用媒体创建时的年月,而非当前日期 $year = $media->created_at->format('Y'); $month = $media->created_at->format('m'); return "{$year}/{$month}/" . substr($md5_var,0,4) . '/' . substr($md5_var,4,4) . '/' . substr($md5_var,8,4) . "/{$md5_var}/"; } /** * 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 { $md5_var = md5($media->id . config('app.key')); $year = $media->created_at->format('Y'); $month = $media->created_at->format('m'); return "{$year}/{$month}/" . substr($md5_var,0,4) . '/' . substr($md5_var,4,4) . '/' . substr($md5_var,8,4) . "/{$md5_var}/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 { $md5_var = md5($media->id . config('app.key')); $year = $media->created_at->format('Y'); $month = $media->created_at->format('m'); return "{$year}/{$month}/" . substr($md5_var,0,4) . '/' . substr($md5_var,4,4) . '/' . substr($md5_var,8,4) . "/{$md5_var}/responsive-images/"; } }
关键说明
- Laravel的Media模型默认会把
created_at字段转为Carbon实例,因此可以直接调用format()方法格式化时间。 - 替换后,无论何时读取文件,都会使用文件存储当天的年月生成路径,和存储时的路径完全一致,彻底解决读取失效问题。
内容的提问来源于stack exchange,提问作者Jon Simson
相关产品推荐
相关产品推荐

