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

