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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:55:17