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

使用PHP下载视频后文件无法播放问题求助

解决PHP下载MP4后无法播放/卡顿的问题

嘿,咱们来搞定你这个下载视频后无法正常播放的问题~你的脚本里有几个常见的小疏漏,这些问题会导致下载的视频文件不完整或者损坏,进而出现播放卡顿甚至无法播放的情况。我给你拆解一下修复方案:

  • 添加文件大小头部,让浏览器明确下载总量
    浏览器需要知道文件的总大小才能正确处理下载流程,缺少这个头部很容易出现下载中断、文件大小识别错误的情况。你可以用filesize()函数获取文件大小,再添加对应的header:

    $name = 'APM1M10VLOUO07C9.mp4';
    // 先检查文件是否存在,避免无意义报错
    if (!file_exists($name)) {
        http_response_code(404);
        exit("抱歉,文件不存在");
    }
    $fileSize = filesize($name);
    
    // 把Content-type改成更准确的video/mp4,部分播放器对这个更敏感
    header("Content-Type: video/mp4");
    header('Content-Disposition: attachment;filename='.$name);
    header("Pragma: no-cache");
    header("Expires: 0");
    header("Content-Length: " . $fileSize); // 关键:添加文件大小头部
    
  • 分块读取文件,避免输出缓冲导致的数据截断
    直接用readfile()处理大视频文件时,可能会因为PHP的输出缓冲机制导致内存溢出,或者数据没有完全发送到浏览器。换成手动分块读取并实时输出的方式更可靠:

    // 清空并关闭所有输出缓冲,确保数据能实时发送给浏览器
    ob_clean();
    flush();
    
    $handle = fopen($name, 'rb');
    if ($handle) {
        // 每次读取8KB内容输出,这个大小在性能和稳定性上比较均衡
        while (!feof($handle)) {
            echo fread($handle, 8192);
            flush(); // 强制把当前内容发送给浏览器
        }
        fclose($handle);
    } else {
        http_response_code(500);
        exit("抱歉,无法打开文件");
    }
    exit;
    
  • 先确认源文件本身的完整性
    别忘了先检查服务器上的APM1M10VLOUO07C9.mp4是不是完好的——比如直接在服务器上播放,或者用FTP下载到本地测试。如果源文件本身就损坏了,那不管怎么改脚本,下载后的文件都没法正常播放。

  • 额外:处理特殊字符文件名(可选)
    虽然你现在的文件名是英文,但如果以后要处理中文或者带特殊字符的文件名,记得做编码处理,避免下载后的文件名乱码:

    $encodedName = rawurlencode($name);
    header('Content-Disposition: attachment;filename="' . $encodedName . '"');
    

把这些整合起来,完整的修复脚本如下:

<?php
$name = 'APM1M10VLOUO07C9.mp4';

// 检查文件是否存在
if (!file_exists($name)) {
    http_response_code(404);
    exit("错误:文件不存在");
}

$fileSize = filesize($name);

// 设置正确的响应头部
header("Content-Type: video/mp4");
header("Content-Disposition: attachment;filename=\"$name\"");
header("Pragma: no-cache");
header("Expires: 0");
header("Content-Length: $fileSize");

// 清空输出缓冲,确保实时发送数据
ob_clean();
flush();

// 分块读取并输出文件
$handle = fopen($name, 'rb');
if ($handle) {
    while (!feof($handle)) {
        echo fread($handle, 8192);
        flush();
    }
    fclose($handle);
} else {
    http_response_code(500);
    exit("错误:无法打开文件");
}
exit;
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:41:32