Hi 你好,欢迎访问!登录
当前位置:首页 - 原创插件 - 正文 君子好学,自强不息!

PHP代理大文件下载(实时流传输版)

2025-10-28原创插件祥技术支持15°c
A+ A-
<?php
/**
 * PHP 代理大文件下载(实时流传输版)
 * 边下载边输出,不缓存完整文件,支持断点续传
 */

$targetUrl = 'https://example.com/large-file.iso'; // 目标文件URL
$timeout = 300; // 超时时间(秒,大文件建议设长一些)
$chunkSize = 8192; // 每次读取的块大小(8KB,可根据服务器调整)

// 禁用输出缓冲
ob_end_clean();
ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', false);

// 第一步:获取目标文件的头部信息(大小、类型等)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$header = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($httpCode != 200) {
    http_response_code(404);
    die("目标文件无法访问,状态码: $httpCode");
}

// 解析文件信息
$fileSize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE) ?: 'application/octet-stream';
preg_match('/filename="([^"]+)"/', $header, $matches);
$fileName = $matches[1] ?? basename(parse_url($targetUrl, PHP_URL_PATH));
curl_close($ch);

// 处理断点续传
$range = 0;
if (isset($_SERVER['HTTP_RANGE'])) {
    if (preg_match('/bytes=(\d+)-(\d*)/', $_SERVER['HTTP_RANGE'], $matches)) {
        $range = intval($matches[1]);
        $end = $matches[2] ? intval($matches[2]) : $fileSize - 1;
    }
}

// 设置响应头(告诉客户端准备接收流数据)
header("Content-Type: $contentType");
header("Content-Disposition: attachment; filename=\"$fileName\"");
header("Accept-Ranges: bytes");
header("Connection: keep-alive");

if ($range > 0) {
    // 断点续传响应
    header("HTTP/1.1 206 Partial Content");
    header("Content-Range: bytes $range-$end/$fileSize");
    header("Content-Length: " . ($end - $range + 1));
} else {
    header("Content-Length: $fileSize");
}

// 第二步:实时流传输(边下载边输出)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); // 不缓存到内存
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); // 二进制传输
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

// 设置断点续传的范围
if ($range > 0) {
    curl_setopt($ch, CURLOPT_RANGE, "$range-$end");
}

// 关键:通过回调函数实时输出数据
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) {
    // 直接向客户端输出当前块数据
    echo $data;
    // 强制刷新输出缓冲区(关键,确保数据即时发送)
    ob_flush();
    flush();
    // 返回已处理的字节数(cURL需要此返回值确认是否继续)
    return strlen($data);
});

// 执行传输(此时会持续调用上面的回调函数输出数据)
curl_exec($ch);

// 检查错误
if (curl_errno($ch)) {
    error_log("传输错误: " . curl_error($ch));
}
curl_close($ch);

exit;


123云盘分享

更新时间:2025年10月28日 11:27:40
      选择打赏方式
    微信赞助

    打赏

    QQ钱包

    打赏

    支付宝赞助

    打赏

    未定义标签

    发表评论

    取消回复

    选填

    必填

    必填

    选填

    请拖动滑块解锁
    >>


      用户登录