PHP开发YouTube视频下载:移动端后缀异常及文件大小不显示修复求助
修复YouTube视频下载的移动端文件名与文件大小显示问题
问题1:移动端下载文件被追加.html后缀
你的代码里Content-Disposition的filename未用引号包裹,部分移动端浏览器会错误解析文件名,把PHP页面的后缀当成文件后缀;如果文件名包含空格、特殊字符,也会加剧解析异常。
修复方式:给filename套双引号,同时用rawurlencode处理文件名,确保跨浏览器兼容:
header("Content-Disposition: attachment; filename=\"" . rawurlencode($fileName) . "\"");
问题2:下载时无法显示文件大小
浏览器需要Content-Length响应头才能预知文件总大小,进而显示下载进度和文件大小。你当前直接用readfile读取远程URL,未传递该头信息,导致浏览器无法识别。
修复方式:先通过get_headers获取远程文件的Content-Length,再设置对应响应头(需确保服务器allow_url_fopen配置为On):
$headers = get_headers($downloadURL, true); if (isset($headers['Content-Length'])) { header("Content-Length: " . $headers['Content-Length']); }
完整修改后的代码
<?php $downloadURL = urldecode($_GET['link']); $type = urldecode($_GET['type']); // mp4, 3gp , mp3 $title = urldecode($_GET['title']); $fileName = $title . '.' . $type; if (!empty($downloadURL) && substr($downloadURL, 0, 8) === 'https://') { // 获取远程文件大小 $headers = get_headers($downloadURL, true); $fileSize = isset($headers['Content-Length']) ? $headers['Content-Length'] : 0; header("Cache-Control: public"); header("Content-Description: File Transfer"); // 修复移动端文件名解析问题 header("Content-Disposition: attachment; filename=\"" . rawurlencode($fileName) . "\""); header("Content-Transfer-Encoding: binary"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: public"); // 设置文件大小头,支持显示下载进度 if ($fileSize > 0) { header("Content-Length: " . $fileSize); } ob_clean(); flush(); readfile($downloadURL); } ?>
额外说明
- 如果服务器
allow_url_fopen无法开启,可以改用CURL请求获取文件大小; rawurlencode处理后的文件名,浏览器会自动解码显示原名称,不会影响用户体验。
内容的提问来源于stack exchange,提问作者Loveyatri
相关产品推荐
相关产品推荐

