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

Laravel 5.5中图片与视频无法更新问题求助

解决Laravel 5.5中更新同名视频后视图显示旧文件的问题

嘿,我之前也碰到过一模一样的情况!这问题根本不是Laravel存储功能的锅,核心原因是浏览器缓存——当你用同名文件覆盖后,浏览器会默认读取本地缓存的旧视频,哪怕你手动清了页面缓存也可能没用(毕竟浏览器对媒体文件的缓存策略更顽固)。下面给你几个实测有效的解决方案:

方案1:给视频URL添加动态版本参数(最推荐)

在视图生成视频URL的时候,给地址加上一个基于文件修改时间的参数,这样每次文件更新,参数值就会变化,浏览器会认为是全新的资源,自动重新请求。

比如你原来的视图代码可能是这样的:

<video src="{{ Storage::url('videos/' . $videoName) }}" controls></video>

改成:

@php
$videoPath = storage_path('app/public/videos/' . $videoName);
$version = file_exists($videoPath) ? filemtime($videoPath) : time();
@endphp
<video src="{{ Storage::url('videos/' . $videoName) }}?v={{ $version }}" controls></video>

原理很简单:filemtime()会返回文件最后修改的时间戳,文件更新后这个值就会变,浏览器看到URL带了新的v参数,就会放弃缓存,重新加载新视频。

方案2:设置响应头禁用缓存

如果不想改视图代码,你可以专门写一个路由来返回视频文件,同时在响应里设置缓存控制头,强制浏览器不缓存:

在routes/web.php里添加:

Route::get('videos/{filename}', function ($filename) {
    $path = storage_path('app/public/videos/' . $filename);
    
    if (!file_exists($path)) {
        abort(404);
    }
    
    $response = response()->file($path);
    // 设置缓存控制,禁止浏览器缓存
    $response->header('Cache-Control', 'no-cache, no-store, must-revalidate');
    $response->header('Pragma', 'no-cache');
    $response->header('Expires', '0');
    
    return $response;
});

然后视图里的视频URL改成这个路由:

<video src="{{ url('videos/' . $videoName) }}" controls></video>

这个方法虽然有效,但会让每次请求都从服务器读取文件,对性能有一点点影响,适合视频更新频率很高的场景。

方案3:检查CDN/服务器静态缓存(如果有)

如果你用了CDN或者服务器(比如Nginx/Apache)配置了静态资源缓存,那哪怕浏览器缓存清了,CDN里可能还存着旧文件。这时候需要去CDN控制台刷新对应文件的缓存,或者调整服务器的缓存策略,缩短视频文件的缓存有效期。

我当时就是用方案1解决的,改完之后刷新页面立刻就看到新视频了,你可以先试试这个!

内容的提问来源于stack exchange,提问作者Alex VTz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:07:40