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
相关产品推荐
相关产品推荐

