PHP实现MP4文件下载后无法播放及文件大小异常问题求助
解决PHP下载MP4文件仅几字节且无法播放的问题
我一眼就揪出你代码里的几个关键问题,这就是下载文件只有几字节、完全没法播放的根源:
问题1:readfile的路径完全错了
你明明定义了完整文件路径$filepath = "/www/servermedia/technounion.mp4",但最后调用readfile($filename)时,用的是basename提取的短文件名——PHP会在当前脚本的工作目录下去找这个文件,而不是你存放视频的/www/servermedia/目录,自然找不到原文件,只能返回空内容,下载的文件就只有几字节。
问题2:Content-Disposition的语法错误
你写的header("Content-Disposition: attachment; filename=.$filename");里,filename=.$filename多了一个多余的点,这会导致下载后的文件名变成.technounion.mp4(带个前缀点),虽然这不是文件无法播放的直接原因,但也是个低级语法错误。
修复后的完整可用代码
<?php // 先清空输出缓冲区,避免之前的空格/换行干扰header发送 ob_clean(); flush(); $filepath = "/www/servermedia/technounion.mp4"; $filename = basename($filepath); // 先检查文件是否存在且可读,提前拦截错误 if (!file_exists($filepath) || !is_readable($filepath)) { die("错误:目标文件不存在或无法读取"); } // 设置正确的响应头 header("Content-Type: video/mp4"); // 用双引号包裹文件名,避免文件名含特殊字符时出问题 header("Content-Disposition: attachment; filename=\"$filename\""); // 告诉浏览器文件实际大小,提升下载体验 header("Content-Length: " . filesize($filepath)); // 用完整路径读取文件并输出 readfile($filepath); exit; ?>
额外要注意的点
- 确保PHP进程对
/www/servermedia/目录有读取权限,否则readfile还是没法访问文件。 - 脚本开头绝对不能有空格、换行或者
echo输出,不然header函数会直接报错,响应头设置失败后浏览器也没法正确识别文件。
内容的提问来源于stack exchange,提问作者ac-programmer
相关产品推荐
相关产品推荐

