You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:27:38