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

Laravel中如何将视频流播放逻辑改为直接下载功能

调整方案

你只需要修改响应的HTTP头,添加Content-Disposition字段指定为附件类型即可触发浏览器下载,两种实现方式如下:

最小改动版(基于你现有代码修改)

仅调整响应头配置即可,其他逻辑保持不变:

$stream = fopen('data://text/plain;base64,' . base64_encode($response),'r');
$stat = fstat($stream);
$size = $stat['size'];

$type = "video/mp4";
$start = 0;
$length = $size;
$status = 200;
// 自定义默认下载文件名,可按需修改
$downloadFileName = 'my-video.mp4';

$headers = [
    'Content-Type' => $type,
    'Content-Length' => $size,
    // 核心新增配置:告知浏览器该资源需要下载
    'Content-Disposition' => 'attachment; filename="' . $downloadFileName . '"'
];

return response()->stream(
    function() use ($stream, $start, $length) {
        fseek($stream, $start, SEEK_SET);
        echo fread($stream, $length);
        fclose($stream);
    }, $status, $headers
);

Laravel 推荐写法(更简洁)

Laravel 内置了streamDownload方法专门处理流下载场景,代码更精简:

$stream = fopen('data://text/plain;base64,' . base64_encode($response),'r');
// 自定义默认下载文件名
$downloadFileName = 'my-video.mp4';
$headers = [
    'Content-Type' => 'video/mp4'
];

return response()->streamDownload(function () use ($stream) {
    // 直接输出流内容,无需手动处理偏移量
    fpassthru($stream);
    fclose($stream);
}, $downloadFileName, $headers);

注意事项

  • 如果文件名包含中文,需要对文件名做编码处理避免乱码,将Content-Disposition修改为如下格式即可:
    'Content-Disposition' => 'attachment; filename*=UTF-8\'\'' . rawurlencode($downloadFileName)
    
  • 原有代码中的Accept-Ranges头是用来支持视频进度拖动播放的,下载场景下可以直接删除,保留也不会影响下载功能。

内容的提问来源于stack exchange,提问作者Jason Polydor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:27:03